poj 1014 Dividing(多重背包)
2013-04-23 09:25
176 查看
题意:有很多的 marble 每种 marble有一个val 1 ...6 。问给否把它们分成两份,使得两份的val
相同。
思路:多重背包 算出总的val的一半,如果dp[val]==val/2 那就能dividing
//1844K
0MS
#include <stdio.h>
#include <string.h>
#define Max 430000
const int n = 6;
int dp[Max];
int count
,val;
int max (int a,int b)
{
return a
> b ? a : b;
}
void MulPack(int cost,int
amount) //多重背包
{
int i;
if
(cost*amount >= val)
{
for (i = cost; i <= val; i ++)
dp[i] = max (dp[i],dp[i-cost] + cost);
return ;
}
int k =
1;
while (k
< amount)
{
for (i = val; i >= k*cost; i --)
dp[i] = max (dp[i],dp[i - k*cost] + k*cost);
amount -= k;
k *= 2;
}
for (i =
val; i >= amount*cost; i --)
dp[i] = max (dp[i],dp[i - amount*cost] + amount*cost);
}
int main ()
{
int i,sum,t
= 0;;
while
(1)
{
sum = 0,val = 0;
memset (dp,0,sizeof(dp));
for (i = 0; i < 6; i ++)
{
scanf ("%d",&count[i]);
val += count[i]*(i+1);
if (!count[i])
sum ++;
}
if (sum == n)
break;
printf ("Collection #%d:\n",++t);
if (val%2 ==
1)
//值为奇的话,就直接不可能
printf ("Can't be divided.\n");
else
{
val /= 2;
for (i = 0; i < n; i ++)
MulPack (i+1,count[i]);
if (dp[val] == val)
printf ("Can be divided.\n");
else
printf ("Can't be divided.\n");
}
printf ("\n");
}
return
0;
}
相同。
思路:多重背包 算出总的val的一半,如果dp[val]==val/2 那就能dividing
//1844K
0MS
#include <stdio.h>
#include <string.h>
#define Max 430000
const int n = 6;
int dp[Max];
int count
,val;
int max (int a,int b)
{
return a
> b ? a : b;
}
void MulPack(int cost,int
amount) //多重背包
{
int i;
if
(cost*amount >= val)
{
for (i = cost; i <= val; i ++)
dp[i] = max (dp[i],dp[i-cost] + cost);
return ;
}
int k =
1;
while (k
< amount)
{
for (i = val; i >= k*cost; i --)
dp[i] = max (dp[i],dp[i - k*cost] + k*cost);
amount -= k;
k *= 2;
}
for (i =
val; i >= amount*cost; i --)
dp[i] = max (dp[i],dp[i - amount*cost] + amount*cost);
}
int main ()
{
int i,sum,t
= 0;;
while
(1)
{
sum = 0,val = 0;
memset (dp,0,sizeof(dp));
for (i = 0; i < 6; i ++)
{
scanf ("%d",&count[i]);
val += count[i]*(i+1);
if (!count[i])
sum ++;
}
if (sum == n)
break;
printf ("Collection #%d:\n",++t);
if (val%2 ==
1)
//值为奇的话,就直接不可能
printf ("Can't be divided.\n");
else
{
val /= 2;
for (i = 0; i < n; i ++)
MulPack (i+1,count[i]);
if (dp[val] == val)
printf ("Can be divided.\n");
else
printf ("Can't be divided.\n");
}
printf ("\n");
}
return
0;
}
相关文章推荐
- POJ 1014 / HDU 1059 Dividing (多重背包&剪枝&单调队列)
- hdu1059 &poj1014 Dividing (多重背包)
- HDU1059 && POJ1014 :Dividing(多重背包)
- poj 1014 Dividing
- Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)
- poj 1014 _ 多重背包
- Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)
- HDU1059 && POJ1014 :Dividing(多重背包)
- POJ 1014 && HDU 1059 Dividing(完全背包问题)
- poj 1014 & zoj 1149 Dividing(多重背包+倍增思想优化)
- POJ1014:Dividing<动归,背包问题>
- ZOJ1149 POJ1014 HDU1059 Dividing,多重背包问题
- 【动态规划/多重背包问题】POJ1014-Dividing
- poj 1014 Dividing 【多重背包】
- 【POJ1014】Dividing (动态规划,多重背包)
- poj 3628_0/1背包
- 20140715 「DP - 多重背包」 POJ 1014 Dividing
- poj 1014 Dividing 多重背包
- poj1014 Dividing (多重背包)
- zoj 1149 || poj 1014 Dividing(多重背包)