HDU1059-Dividing-DP(多重背包)
2015-09-04 18:55
344 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059
这个题目据说是有两种方法可以过的。
我的第一反应就是多重背包(原理我就不解释),先看AC代码;
这个题目据说是有两种方法可以过的。
我的第一反应就是多重背包(原理我就不解释),先看AC代码;
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=500005; int n,m; int dp ; int data[7]; void ZeroOnePack(int v,int w) { for(int i=m;i>=v;i--) dp[i]=max(dp[i-v]+w,dp[i]); } void CompletePack(int v,int w) { for(int i=v;i<=m;i++) dp[i]=max(dp[i],dp[i-v]+w); } void MultiPack(int v,int w,int cnt) { if(v*cnt>=m){ CompletePack(v,w); return; } for(int i=1;i<cnt;i*=2){ ZeroOnePack(i*v,i*w); cnt-=i; } ZeroOnePack(cnt*v,cnt*w); } int main() { int Case=1; while(scanf("%d",&data[1])!=EOF){ for(int i=2;i<=6;i++) scanf("%d",&data[i]); bool out=true; int sum=0; for(int i=1;i<=6;i++){ sum+=data[i]*i; if(data[i]) out=false; } if(out) break; m=sum/2; printf("Collection #%d:\n",Case++); if(sum&1){ printf("Can't be divided.\n"); printf("\n"); continue; } memset(dp,0,sizeof(dp)); for(int i=1;i<=6;i++) if(data[i]) MultiPack(i,i,data[i]); if(dp[m]==m) printf("Can be divided.\n"); else printf("Can't be divided.\n"); printf("\n"); } return 0; }
相关文章推荐
- mysql引擎
- Android一些设计原则杂项
- Linux 硬限制和软限制 http://www.cppblog.com/API/archive/2012/03/19/168289.html
- hdu3549(又是最大流模板题)
- 剑指offer:重建二叉树
- 算法学习笔记[LeetCode][ZigZag Conversion]
- Application应用共享数据
- 【HAOI2011】【BZOJ2300】防线修建
- 排序算法(一):选择排序、插入排序和希尔排序
- Android test---SL4A
- swift 学习<五> 闭包
- Codeforces Gym 100002 E "Evacuation Plan" 费用流
- .NET基础 (01).NET基础概念
- 正则表达式
- 关于卷积的一个血腥的讲解,看完给跪了
- HDU 5240 Exam
- Java学习之equals和==的区别
- 腾讯面试(一)
- v4的sample学习--Content/LocalServiceBroadcaster+FileProviderExample
- 【Spring MVC】Spring MVC启动过程源码分析