-
B - Dividing
- HDU - 1059
- 题意:给出1,2,3,4,5,6,各种钱的数量,问能否拼出总钱数的一半。
- 思路 :按照背包总容量为总钱数的一半跑一下多重背包即可。
-
#include<bits/stdc++.h> using namespace std; #define maxn 122259 int dp[maxn],sum,n,w; struct node { int v,w,k; } num[maxn]; void zeropack(int C,int W) { for(int i=sum; i>=C; i--) dp[i]=max(dp[i],dp[i-C]+W); } void compack(int C,int W) { for(int i=C; i<=sum; i++) dp[i]=max(dp[i],dp[i-C]+W); } bool mult() { memset(dp,0,sizeof(dp)); for(int i=1; i<=6; i++) { if(num[i].k*num[i].v>sum) compack(num[i].v,num[i].w); else { int temp=1; while(temp<num[i].k) { zeropack(temp*num[i].v,temp*num[i].w); num[i].k-=temp; temp<<=1; } zeropack(num[i].k*num[i].v,num[i].k*num[i].w); } } if(dp[sum]==sum)return 1; return 0; } int main() { int cas=1; for(int i=1; i<=6; i++) num[i].w=num[i].v=i; while(~scanf("%d%d%d%d%d%d",&num[1].k,&num[2].k,&num[3].k,&num[4].k,&num[5].k,&num[6].k)) { sum=0; for(int i=1; i<=6; i++)sum+=num[i].k*num[i].w; if(sum==0)break; printf("Collection #%d:\n",cas++); if(sum%2) { printf("Can't be divided.\n\n"); continue; } sum/=2; if(mult()) printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n"); } return 0; }
B - Dividing HDU - 均分问题-多重背包
最新推荐文章于 2020-10-09 23:03:59 发布