多重部分和问题

来源:互联网 发布:潘石屹 三段婚姻 知乎 编辑:程序博客网 时间:2024/05/29 17:48
                    n中不同大小的数字ai,每种各mi个。判断是否可以从这些数字之中选出若干使他们的大小恰好为K.
限制条件


1<=n<=100
1<=ai,mi<=100000
1<=k<=100000


输入


多组数据。
第一行n。第二行不同的数字ai.第三行对应数字拥有的个数


输出


能挑选若干恰好和为K则输出“Yes”,反之输出“No”.


样例输入


1
3
3 5 8
3 2 2
17
样例输出


Yes



背包问题的转化,重点还是01背包公式的用法

#include <stdio.h>#include <string.h>#define max(a,b) a>b?a:bint main(){int t;scanf("%d",&t);while(t--){int a[105],m[105],k,n,i,j;int dp[10005];memset(dp,-0x3f,sizeof(dp));dp[0]=0;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&a[i]);}for(i=0;i<n;i++){scanf("%d",&m[i]);}scanf("%d",&k);for(i=0;i<n;i++){for(int v=0;v<m[i];v++){for(j=k;j>=a[i];j--){dp[j]=max(dp[j],dp[j-a[i]]+a[i]);}}if(dp[k]==k){printf("Yes\n");break;}}if(i==n){printf("No\n");}} return 0;}


0 0
原创粉丝点击