HDU 1059 物品价值平分问题,母函数或者多重背包 与 2844类似
来源:互联网 发布:走进北上广深 知乎 编辑:程序博客网 时间:2024/06/01 09:40
#include <stdio.h> #include <string.h> #define Size 60005 #define Max(a,b) a>b?a:b int sum; int dp[Size]; /*01背包*/ 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 MulPack(int cost,int weight,int count) { int i; if(cost*count>=sum) { CompletePack(cost,weight); return ; } i = 1; /*二进制划分*/ while (i<count) { ZeroOnePack(i*cost,i*weight); count-=i; i<<=1; } ZeroOnePack(count*cost,count*weight); } int main() { int num[7],no = 1,i; while (1) { sum = 0; for(i=1;i<=6;i++) { scanf("%d",&num[i]); sum+=num[i]*i; } if(!sum) break; if(sum&1) printf("Collection #%d:\nCan't be divided.\n\n",no++); else { sum>>=1; for(i=0;i<=sum;i++) dp[i] = 0; for(i=1;i<=6;i++) if(num[i]) MulPack(i,i,num[i]); if(dp[sum] == sum) printf("Collection #%d:\nCan be divided.\n\n",no++); else printf("Collection #%d:\nCan't be divided.\n\n",no++); } } return 0; }
2. 母函数版本
#include <iostream>using namespace std;int main(){int cnt[7];int p[7];for(int i = 0; i <= 6; i++)p[i] = i;int t = 0; while(cin >> cnt[1] >> cnt[2] >> cnt[3] >> cnt[4] >> cnt[5] >> cnt[6],cnt[1] || cnt[2] || cnt[3] || cnt[4] || cnt[5] || cnt[6]){t++;int Max = 0;for(int i = 1; i <= 6; i++){cnt[i] %= 30; //重点,不加这句会超时Max += cnt[i] * p[i];}if(Max % 2){printf("Collection #%d:\n", t);printf("Can't be divided.\n\n");continue;}Max = Max / 2;int *c1 = new int[Max + 1];int *c2 = new int[Max + 1];for(int i = 0; i < Max + 1; i++){c1[i] = 0;c2[i] = 0;}for(int i = 0; i <= cnt[1]; i++){c1[i] = 1;c2[i] = 0;}for(int i = 2; i <= 6; i++){for(int j = 0; j <= Max; j++) {int num = cnt[i] * p[i];for(int k = 0; k <= num && k + j <= Max; k += p[i]){c2[k+j] += c1[j];}}for(int j = 0; j <= Max; j++){c1[j] = c2[j];c2[j] = 0;}if(c1[Max])break;}int flag = 0;if(c1[Max] != 0)flag = 1;delete [] c1;delete [] c2;printf("Collection #%d:\n", t);if(flag == 0)printf("Can't be divided.\n\n");elseprintf("Can be divided.\n\n");}return 0;}
- HDU 1059 物品价值平分问题,母函数或者多重背包 与 2844类似
- 【HDU 1171】【背包DP 或者 母函数】Big Event in HDU【有n样物品,每样物品价值是v,件数是m。尽量把这些物品分成两堆使得两边总价值最接近】
- 计蒜客 平分娃娃(多重背包问题二进制优化)
- HDU 多重背包问题
- hdu 2844 Coins (多重背包问题)
- hdu 1059 Dividing--DP-多重背包问题
- HDU 1059 Dividing (多重背包问题)
- hdu 1059 多重背包问题 Dividing
- HDU 1059 Dividing 多重背包问题
- hdu 2191 多重背包(物品的件数固定)
- HDU-2844 多重背包
- hdu 2844 多重背包
- hdu 2844 多重背包
- hdu 2844 多重背包
- hdu 2844 多重背包
- hdu 2844 多重背包
- HDU 2844 (多重背包)
- hdu 2844(多重背包)
- 关于java中Math的一些用法
- 列出当前网络上的活动主机
- 行走职场人士必看的寓言
- 判断是否是回文
- JAVA 串口编程(二)
- HDU 1059 物品价值平分问题,母函数或者多重背包 与 2844类似
- 春分、冬至、黄道、赤道
- 事件与委托有别, delegate 与 Delegate 相异
- javaweb项目jdk1.5升级1.6
- JAVA 串口编程 (一)
- javax.mail.AuthenticationFailedException 的解决方案
- sqlserver 远程连接
- 蓝牙基础
- 最近太忙了