多重部分和问题

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<queue>
 5 #include<map>
 6 #include<vector>
 7 #include<set>
 8 #include<string>
 9 #include<cmath>
10 #include<cstring>
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<n;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(j<a[i]||dp[j-a[i]]<=0)//j<a[i]说明ai比k大,没办法拼,-1
28             //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<n;i++)
48         scanf("%d",&a[i]);
49     for(int i=0;i<n;i++)
50         scanf("%d",&m[i]);        
51     scanf("%d",&K);
52     solve();
53     return 0;
54 }

 

posted @ 2020-02-09 11:45  付玬熙  阅读(147)  评论(0编辑  收藏  举报