多重部分和问题


 1 #include
 2 #include
 3 #include
 4 #include
 5 #include
 6 #include
 7 #include<set>
 8 #include<string>
 9 #include
10 #include
11 using namespace std;
12 int a[100000+10];
13 int m[100000+10];
14 int K,n;
15 int dp[100000+10];
16 void solve()
17 {
18     memset(dp,-1,sizeof(dp));    
19     dp[0]=0;
20     for(int i=0;i)
21     {
22         printf("i=%d\n",i);
23         for(int j=0;j<=K;j++)
24         {
25             if(dp[j]>=0)//已经拼好了说明ai可以剩下mi个 
26                 dp[j]=m[i];
27             else if(j0)//j28             //dp[j-ai]如果不可分或者=0下面就不能-1 
29                 dp[j]=-1;
30             else//如果dp[j-ai]可以分,那么dp[j]=dp[j-ai]-1; 
31                 dp[j]=dp[j-a[i]]-1;
32 //            printf("    dp[%d]=%d\n",j,dp[j]);
33         }
34     }
35     if(dp[K]>=0)
36         printf("Yes\n"); 
37     else
38         printf("No\n");
39 } 
40 int main()
41 {
42 //n=3 
43 //a=3 5 8
44 //m=3 2 2
45 //k=17
46     scanf("%d",&n);
47     for(int i=0;i)
48         scanf("%d",&a[i]);
49     for(int i=0;i)
50         scanf("%d",&m[i]);        
51     scanf("%d",&K);
52     solve();
53     return 0;
54 }
oj