HDU - 1059 多重背包模板题
2017-08-09 16:21
134 查看
题意:有价值为1,2,3,4,5,6的物品,每种物品都有一定数量,问这些物品能不能平分成价值相同的两份;
思路:多重背包模板题,以价值总额的一半为背包容量
思路:多重背包模板题,以价值总额的一半为背包容量
#include<iostream> #include<algorithm> #include<string> #include<cstring> #include<map> #include<queue> #include<cmath> #include<stack> #include<vector> #include<cstdio> #define MAXN 33000 #define INF 0x3f3f3f3f #define lmid l,m,rt<<1 #define rmid m+1,r,rt<<1|1 #define ls rt<<1 #define rs rt<<1|1 #define Mod 1000000007 #define i64 __int64 #define LIMIT_ULL 100000000000000000 using namespace std; int dp[60005]; int a[10]; void dc(int v,int w,int sum) { if(v*w>=sum) { for(int i=w;i<=sum;i++) { dp[i]=max(dp[i],dp[i-w]+w); } } else { int k=1; while(k<v) { for(int i=sum;i>=k*w;i--) { dp[i]=max(dp[i],dp[i-k*w]+k*w); } v-=k; k*=2; } k=v; for(int i=sum;i>=k*w;i--) { dp[i]=max(dp[i],dp[i-k*w]+k*w); } } } int main() { int ca=1; while(1) { int flag=0; int sum=0; for(int i=1;i<=6;i++) { scanf("%d",&a[i]); if(a[i]==0) flag++; sum+=a[i]*i; } if(flag==6) break; if(sum%2) { printf("Collection #%d:\n",ca++); cout<<"Can't be divided."<<endl<<endl; continue; } memset(dp,0,sizeof(dp)); sum/=2; for(int i=1;i<=6;i++) { dc(a[i],i,sum); } if(dp[sum]==sum) { //cout<<dp[sum]<<endl; printf("Collection #%d:\n",ca++); cout<<"Can be divided."<<endl; } else { printf("Collection #%d:\n",ca++); cout<<"Can't be divided."<<endl; } cout<<endl; } return 0; }
相关文章推荐
- HDU1059 Dividing(多重背包,二进制优化,模板题)
- HDU 1059 Dividing (多重背包模板题,条件改变,比较灵活)
- HDU1059_Dividing_多重背包
- hdu_1059_多重背包
- HDU 1059 物品价值平分问题,母函数或者多重背包 与 2844类似
- hdu 1114 完全背包模板题(装满的)
- hdu 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包模板题)
- HDU 1059 POJ 1014 Dividing (多重背包)
- hdu 1059 Dividing(多重背包)
- hdu 1059 练习练习dp(多重背包)
- HDU 1059 Dividing 多重背包
- hdu 1059 Dividing(完全背包)
- Hdu 1059 Dividing (多重背包)
- hdu1059 Dividing(多重背包二进制优化)
- 【hdu1059】多重背包部分和
- HDU1059 二进制拆分优化多重背包
- hdu 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包模板题)
- HDU-1059 Dividing (多重背包)
- hdu1059(多重背包)
- hdu 1059 Dividing(完全背包)