您的位置:首页 > 其它

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: