(1059)HDU
来源:互联网 发布:催眠的电影 知乎 编辑:程序博客网 时间:2024/05/21 19:10
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>
#define ll __int64
#define MAX 1000009
using namespace std;
int c[MAX];//件数
int w[MAX];//尺寸
int v[MAX];//价值
int dp[MAX];
int Count;//分解完的物品总数
int Value[MAX];//分解完的每件物品的价值
int Size[MAX];//分解完每件物品的体积
int V;//总价值
int d;
int main()
{
d = 1;
while(~scanf("%d%d%d%d%d%d",&c[1],&c[2],&c[3],&c[4],&c[5],&c[6]))
{
if(c[1]+c[2]+c[3]+c[4]+c[5]+c[6]==0)break;
V = 0;
for(int i = 1; i<=6; i++)
{
v[i] = i;
V+=c[i]*i;
}
//二进制处理
Count = 1;
for(int i = 1; i<=6; i++)
{
for(int j = 1; j<=c[i]; j<<=1)
{
Value[Count++] = j*v[i];
c[i]-=j;
}
if(c[i]>0)
{
Value[Count++] = c[i]*v[i];
}
}
int VV = V/2;
//转化01背包
memset(dp,0,sizeof(dp));
for(int i = 1; i<Count; i++)
{
for(int j = VV; j>=Value[i]; j--)
{
dp[j] = max(dp[j],dp[j-Value[i]]+Value[i]);
}
}
printf("Collection #%d:\n",d++);
if(dp[VV] == V - VV)
printf("Can be divided.\n\n");
else
printf("Can't be divided.\n\n");
}
return 0;
#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>
#define ll __int64
#define MAX 1000009
using namespace std;
int c[MAX];//件数
int w[MAX];//尺寸
int v[MAX];//价值
int dp[MAX];
int Count;//分解完的物品总数
int Value[MAX];//分解完的每件物品的价值
int Size[MAX];//分解完每件物品的体积
int V;//总价值
int d;
int main()
{
d = 1;
while(~scanf("%d%d%d%d%d%d",&c[1],&c[2],&c[3],&c[4],&c[5],&c[6]))
{
if(c[1]+c[2]+c[3]+c[4]+c[5]+c[6]==0)break;
V = 0;
for(int i = 1; i<=6; i++)
{
v[i] = i;
V+=c[i]*i;
}
//二进制处理
Count = 1;
for(int i = 1; i<=6; i++)
{
for(int j = 1; j<=c[i]; j<<=1)
{
Value[Count++] = j*v[i];
c[i]-=j;
}
if(c[i]>0)
{
Value[Count++] = c[i]*v[i];
}
}
int VV = V/2;
//转化01背包
memset(dp,0,sizeof(dp));
for(int i = 1; i<Count; i++)
{
for(int j = VV; j>=Value[i]; j--)
{
dp[j] = max(dp[j],dp[j-Value[i]]+Value[i]);
}
}
printf("Collection #%d:\n",d++);
if(dp[VV] == V - VV)
printf("Can be divided.\n\n");
else
printf("Can't be divided.\n\n");
}
return 0;
}
分数,问你分的价值能否一样,这里不涉及物体所占的体积,所以w[i]是不用算的,我们直接算的是价值,所以在01背包部分我们写的是
dp[j] = max(dp[j],dp[j-Value[i]]+Value[i]);
注意这里就可以,还有就是对多重背包的二进制分解,这里贴个博客,对二进制有很好的解释
//http://blog.csdn.net/lyhvoyage/article/details/8545852我觉得上面说的我明白····
0 0
- hdu 1059
- HDU 1059
- HDU 1059
- hdu 1059
- hdu 1059
- HDU 1059
- (1059)HDU
- HDU-1059 多重背包
- hdu 1059 Dividing
- 【多重背包】HDU 1059
- HDU 1059 多重背包
- hdu 1059 Dividing
- HDU 1059 多重背包
- hdu 1059 多重背包
- hdu 1059 Dividing
- HDU 1059 Dividing
- HDU 1059 背包问题
- hdu 1059 Dividing
- atoi()——把字符串转换成整型数
- python开发工具及入门
- 字符编码
- requireJS源码分析
- C/C++ 数组下标可以是负值
- (1059)HDU
- LeetCode141:Given a linked list, determine if it has a cycle in it.
- Merge Sorted Array
- 24天学会设计模式------策略模式
- Android中自定义特定颜色的Toast
- php处理数组时,常用的两个函数
- 最小生成树 Prim以及Kruskal算法及效率解析
- c#一次上传多个文件的写法
- 使用C#获取CPU及硬盘序列号的源代码