hdu1059 多重背包
2016-04-24 21:06
288 查看
题意就是给你价值从1到6的物体的个数
求是否可以给他们平分
用多重背包解决
AC代码:
求是否可以给他们平分
用多重背包解决
AC代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int dp[120005]; int w[120005],a[1000],b[1000]; int max(int x,int y) { return x>y?x:y; } void zero(int cost,int weight,int n) ///01背包 { for(int i = n; i >= cost; i--) dp[i] = max(dp[i],dp[i-cost] + weight); } void complete(int cost,int weight,int n) ///完全背包 { for(int i = cost; i <= n; i++) dp[i] = max(dp[i],dp[i-cost] + weight); } void multi(int v,int w,int num,int sum) { if(v*num > sum) ///如果取完了大于总的价值 用完全背包 complete(v,w,sum); else ///否则 01 背包 { int k = 1; while(k < num) { zero(k*v,k*w,sum); num-=k; k=k*2; } zero(num*v,num*w,sum); } } int main() { int t = 0; while(~scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])) { t++; int v; int total = a[1]*1 + a[2]*2 + a[3]*3 + a[4]*4 + a[5]*5< d626 span style="color:#FF00FF;"> + a[6]*6; if(total == 0) break; if(total%2!=0) { printf("Collection #%d:\nCan't be divided.\n\n",t); continue; } else { memset(dp,0,sizeof(dp)); v = total/2; for(int i = 1; i <= 6; i++) multi(i,i,a[i],v); if(dp[v]==v) printf("Collection #%d:\nCan be divided.\n\n",t); else printf("Collection #%d:\nCan't be divided.\n\n",t); } } return 0; }
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 自顶向下动态规划解决最长公共子序列(LCS)问题
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 关于爬楼梯的动态规划算法
- 动态规划 --- hdu 1003 **
- DP问题各种模型的状态转移方程
- 0-1背包解题过程
- 背包问题
- USACO 3.2.2:Stringsobits
- 字符串编辑距离