zoj 1149 && hdu 1059 && poj 1014 Dividing
2014-01-19 16:08
381 查看
多重背包转化为01背包。
学习了二进制在背包问题中的应用。。。爽!!!!!
以下代码在hdu 交会超时,要想办法剪枝!!
学习了二进制在背包问题中的应用。。。爽!!!!!
以下代码在hdu 交会超时,要想办法剪枝!!
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int a[8]; int bag[120005]; int v[120005],cc,sum; void DP() { int i,j; memset(bag,0,sizeof(bag)); for(i=0;i<cc;i++) { for(j=sum;j>=v[i];j--) { bag[j]=max(bag[j],bag[j-v[i]]+v[i]); } } } int main() { int cas=1,cnt,tmp; while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])!=EOF) { if(a[1]+a[2]+a[3]+a[4]+a[5]+a[6]==0) break; printf("Collection #%d:\n",cas++); cnt=0,sum=0; for(int i=1;i<=6;i++) sum+=a[i]*i; if(sum%2) { printf("Can't be divided.\n\n"); continue; } sum=sum/2,cc=0; for(int i=1;i<=6;i++) { if(a[i]==0) continue; tmp=1; while(a[i]>tmp) { v[cc++]=tmp*i; a[i]-=tmp; tmp=tmp*2; } if(a[i]) v[cc++]=a[i]*i; } DP(); if(bag[sum]!=sum) printf("Can't be divided.\n\n"); else printf("Can be divided.\n\n"); } return 0; }
相关文章推荐
- Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)
- Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)
- ZOJ 1149 || POJ 1014 || HDU 1059 Dividing
- ZOJ1149 POJ1014 HDU1059 Dividing,多重背包问题
- poj 1014 && zoj 1149 Dividing --- dfs剪枝
- [dp问题] Poj 1014 & Zoj 1149 (Dividing) 解题报告(转)
- hdu1059 &poj1014 Dividing (多重背包)
- HDU1059 && POJ1014 :Dividing(多重背包)
- poj 1014 & zoj 1149 Dividing(多重背包+倍增思想优化)
- HDU1059 && POJ1014 :Dividing(多重背包)
- hdu 1059&&POJ 1014 Dividing
- POJ 1014 && HDU 1059 Dividing(完全背包问题)
- poj1014 hdu1059 Dividing 多重背包
- poj1014 hdu1059 Dividing 多重背包
- (pku 1014) (hdu 1059) (zoj 1049) Dividing muhanshu
- poj 1014 || zoj 1149 Dividing
- HDOJ 1059 && POJ 1014 Dividing
- poj 1014||hdu 1059 dividing(多重背包 二进制优化)
- zoj 1149 || poj 1014 Dividing(多重背包)
- POJ 1014 / HDU 1059 Dividing (多重背包&剪枝&单调队列)