1 solutions

  • -4
    @ 2025-5-27 13:30:02

    还没写完

    先放代码再解释

    #include<bits/stdc++.h>
    using namespace std;
    int dp[41][100001];
    int num[41][100001];int len=0,n;
    string s;
    int main(){
    	cin>>s>>n;
        len=s.size();
        memset(dp,0x3f3f3f3f,sizeof dp);
        for(int i=1;i<=len;i++)num[i][i]=s[i-1]-'0';
        for(int i=1;i<=len;i++){
            for(int j=i+1;j<=len;j++){
            	if(0LL+num[i][j-1]*10+s[j-1]-'0'>100000)num[i][j]=100010;
                else num[i][j]=num[i][j-1]*10+s[j-1]-'0';
            }
        }
        dp[0][0]=-1;
    	for(int i=1;i<=len;i++){
            for(int k=0;k<=n;k++){
                for(int j=i-1;j>=0;j--){
                    if(k>=num[j+1][i]&&num[j+1][i]<=100000){
                        dp[i][k]=min(dp[i][k],dp[j][k-num[j+1][i]]+1);
                    }
                }
            }
        }
    	if(dp[len][n]<40&&dp[len][n]>=0)cout<<dp[len][n];
    	else cout<<"-1";
    	return 0;
    }
    

    解释:

    1、num数组

    num[i][j]表示第i个到第j个表示的数

    例如:

    
    
    • 1

    Information

    ID
    841
    Time
    1000ms
    Memory
    500MiB
    Difficulty
    3
    Tags
    # Submissions
    69
    Accepted
    4
    Uploaded By