dp之多重背包hdu1059
题意:价值为1,2,3,4,5,6. 分别有n[1],n[2],n[3],n[4],n[5],n[6]个。求能否找到满足价值刚好是所有的一半的方案。
思路:简单的多重背包,我建议多重背包都用二进制拆分优化下........
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int dp[200000],w[200000]; int main() { int t[7],text=0; while(1) { int sum=0; for(int i=1;i<=6;i++) { scanf("%d",&t[i]); sum+=i*t[i]; } if(sum==0) break; printf("Collection #%d:\n",++text); if(sum%2==1) { printf("Can't be divided.\n\n"); continue; } sum/=2; int cnt=0; for(int i=1;i<=6;i++) { int k=1; while(t[i]-k>0) { w[cnt++]=k*i; t[i]-=k; k*=2; } w[cnt++]=t[i]*i; } memset(dp,0,sizeof(dp)); for(int i=0;i<cnt;i++) { for(int j=sum;j>=w[i];j--) if(dp[j]<dp[j-w[i]]+w[i]) dp[j]=dp[j-w[i]]+w[i]; } if(dp[sum]==sum) printf("Can be divided.\n"); else printf("Can't be divided.\n"); printf("\n"); } return 0; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。