HDU 1059 Dividing (多重背包+二进制优化)
2014-09-05 18:03
309 查看
题目链接:HDU 1059 Dividing
题意:给出6种硬币的个数,他们的价值分别是1-6。问能否按价值平均分成2份。
多重背包问题,dp[]的意义是 背包容量为i的背包,最多大的价值。判断dp[half]==half? 相等就可以,不等就不可以。纯多重背包会超时。加个二进制优化(可以参考背包九讲)。
类似的题目 UVA562 这个是01背包的问题。
AC代码:
题意:给出6种硬币的个数,他们的价值分别是1-6。问能否按价值平均分成2份。
多重背包问题,dp[]的意义是 背包容量为i的背包,最多大的价值。判断dp[half]==half? 相等就可以,不等就不可以。纯多重背包会超时。加个二进制优化(可以参考背包九讲)。
类似的题目 UVA562 这个是01背包的问题。
AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct Marble { int val; int num; }; struct Marble m[10]; int dp[120010]; int half; void ZeroOnePack(int cost,int weight) { int i,j; for(j=half;j>=cost;j--) dp[j]=max(dp[j],dp[j-cost]+weight); } void CompletePack(int cost,int weight) { int i,j; for(j=cost;j<=half;j++) dp[j]=max(dp[j],dp[j-cost]+weight); } void MultiplePack(int cost,int weight,int amount) { if(cost*amount>=half) { CompletePack(cost,weight); return ; } int k=1; while(k<amount) { ZeroOnePack(k*cost,k*weight); amount-=k; k*=2; } ZeroOnePack(amount*cost,amount*weight); } int main() { int i,j,k,cas=1; for(i=1; i<=6; i++) m[i].val=i; while(scanf("%d %d %d %d %d %d",&m[1].num,&m[2].num,&m[3].num,&m[4].num,&m[5].num,&m[6].num)) { int s=0,sum=0; for(i=1; i<=6; i++) { if(m[i].num==0) s++; sum+=m[i].num*m[i].val; } if(s==6) break; printf("Collection #%d:\n",cas++); if(sum%2) { printf("Can't be divided.\n\n"); continue; } half=sum/2; memset(dp,0,sizeof dp); for(i=1;i<=6;i++) MultiplePack(m[i].val,m[i].val,m[i].num); //printf("%d\n",dp[half]); if(dp[half]==half) printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n"); } return 0; }
相关文章推荐
- HDU-1059 Dividing (多重背包 二进制优化+剪枝)
- hdu 1059 Dividing(二进制转化优化) 分组背包
- HDU 1059 Dividing(多重背包二进制优化)
- [HDU 1059] Dividing (多重背包+二进制优化)
- hdu-1059-Dividing(多重背包+二进制优化)
- HDU1059 Dividing(多重背包,二进制优化,模板题)
- HDU 1059 Dividing(多重背包 , 二进制优化形成01背包)
- hdu1059 Dividing(多重背包+二进制优化)
- hdu 1059 Dividing 多重背包,二进制优化
- HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)
- hdu1059 Dividing(多重背包二进制优化)
- DP(完全背包二进制优化) Problem T:Dividing(HDU 1059)
- 动态规划:HDU1059-Dividing(多重背包问题的二进制优化)
- HDU 1059 Dividing 多重背包二进制优化
- HDU 1059 Dividing (多重背包二进制优化)
- poj 1014||hdu 1059 dividing(多重背包 二进制优化)
- 【日常学习】【多重背包】【二进制优化】hdu1059 Dividing题解
- HDU——1059 Dividing(多重背包+二进制优化)
- 【二进制拆分多重背包】【HDU1059】【Dividing】
- 暑期dp46道(23)HDOJ 1059 Dividing 多重背包+二进制优化