hdu 1059 练习练习dp(多重背包)
2013-07-04 13:52
337 查看
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059
经典的多重背包问题,有若干个数,每个数可以取若干个,求问能不能取到总和的一半
直接把模板一敲就差不多了~
经典的多重背包问题,有若干个数,每个数可以取若干个,求问能不能取到总和的一半
直接把模板一敲就差不多了~
#include<iostream> #include<string.h> #include<vector> #include<algorithm> using namespace std; const int size = 600000; int sum; int dp[size]; void zeroOnePack(int cost,int weight) { int i; for(i=sum;i>=cost;i--) dp[i] = max(dp[i],dp[i-cost]+weight); } void completePack(int cost,int weight) { int i; for(i=cost;i<=sum;i++) dp[i]=max(dp[i],dp[i-cost]+weight); } void MultiPack(int cost,int weight,int count) { int i=1; if(cost*count>=sum) { completePack(cost,weight); return ; } while(i<count) { zeroOnePack(cost*i,weight*i); count-=i; i<<=1; } zeroOnePack(cost*count,weight*count); } int main() { int num[7],no=1,i; while(1) { sum = 0; for(int i=1;i<7;i++) { cin>>num[i]; sum+=num[i]*i; } if(!sum) break; if(sum&1) cout<<"Collection #"<<no++<<":"<<endl<<"Can't be divided."<<endl<<endl; else { sum>>=1; for(i=0;i<=sum;i++) dp[i] = 0; for(i=1;i<7;i++) if(num[i]) MultiPack(i,i,num[i]); if(dp[sum]==sum) cout<<"Collection #"<<no++<<":"<<endl<<"Can be divided."<<endl<<endl; else cout<<"Collection #"<<no++<<":"<<endl<<"Can't be divided."<<endl<<endl; } } return 0; }
相关文章推荐
- hdu1059 dp(多重背包二进制优化)
- DP(完全背包二进制优化) Problem T:Dividing(HDU 1059)
- 小白算法练习 简单背包专题003 完全背包 hdu lanqiao 包子凑数 dp
- hdu 1059 Dividing DP,多重背包 测试数据很水
- hdu 1059 Dividing--DP-多重背包问题
- HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)
- ACM学习历程—HDU 1059 Dividing(dp && 多重背包)
- HDU1059 多重背包 多重部分和问题DP
- HDU 1059 Dividing dp背包题解
- HDU 1059 Dividing 【DP背包】
- HDU1059-Dividing-DP(多重背包)
- HDU 1059 Dividing(dp多重背包)
- hdu--1059--多重背包||DP||搜索
- hdu 1059 Dividing(多重背包)
- hdu1059 &poj1014 Dividing (多重背包)
- HDU 1059 Dividing 多重背包动态规划
- (DP,背包,只有价值)Big Event in HDU -- HDOJ
- hdu 1059 Dividing 多重背包
- HDU 4901 DP背包
- HDU--dp练习--1001--Robberies