hdu 1059 Dividing (多重背包)
2013-08-02 09:59
441 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059
解题报告:这道题的方法没有什么特别之处,就是套用多重背包的模板,注意两点 :dp[]开的要大一些,刚开始20005时老是run time error 。还有就是在01函数中最大的上限用half,别用一个非常大的数字,像20005,总会wa,应该是数据范围超了吧
code:
解题报告:这道题的方法没有什么特别之处,就是套用多重背包的模板,注意两点 :dp[]开的要大一些,刚开始20005时老是run time error 。还有就是在01函数中最大的上限用half,别用一个非常大的数字,像20005,总会wa,应该是数据范围超了吧
code:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[100010],num[10]; int sum,half; void Complete(int val) { for(int i=val;i<=half;i++) dp[i]=max(dp[i],dp[i-val]+val); } void ZeroOne(int val) { for(int i=half;i>=val;i--) dp[i]=max(dp[i],dp[i-val]+val); } void solve(int val,int n) { if(n*val>half) {Complete(val); return ;} int k=1; while(k<n) { ZeroOne(k*val); n-=k; k*=2; } ZeroOne(n*val); } int main() { int ncase=0; while(1) { sum=0; for(int i=1;i<=6;i++) { scanf("%d",&num[i]); sum+=num[i]*i; } if(sum==0) break; if(sum%2) { printf("Collection #%d:\n",++ncase); printf("Can't be divided.\n\n") ; continue; } half=sum/2; memset(dp,0,sizeof(dp)); for(int i=1;i<=6;i++) solve(i,num[i]); printf("Collection #%d:\n",++ncase); if(dp[half] == half) printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n") ; } return 0; }
相关文章推荐
- HDU 1059 Dividing(多重背包)
- HDU1059 && POJ1014 :Dividing(多重背包)
- poj1014 hdu1059 Dividing 多重背包
- HDU_1059 Dividing 【多重背包】
- [0-1背包]HDU 1059 Dividing
- (step3.3) hdu 1059(Dividing——多重背包)
- HDU 1059 Dividing(多重背包)
- HDU 1059 Dividing(多重背包)
- HDU-1059-Dividing-wust9(背包)
- HDU 1059 Dividing 多重背包 .
- HDU 1059(Dividing)多重背包
- [HDU 1059] Dividing (多重背包+二进制优化)
- hdu1059 Dividing 我的ACM我的梦,回顾篇 完全背包
- HDU 1059 Dividing 多重背包二进制优化
- hdu-1059-多重背包-Dividing
- poj 1014||hdu 1059 dividing(多重背包 二进制优化)
- hdu 1059 Dividing (多重背包)
- 【动态规划】【多重背包】[HDU 1059]Dividing
- HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)
- [hdu1059]Dividing 多重背包