现在的位置: 首页 > 综合 > 正文

poj 1014 Dividing(多重背包)

2018年03月17日 ⁄ 综合 ⁄ 共 1006字 ⁄ 字号 评论关闭
题意:有很多的 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[n],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)            
//值为奇的话,就直接不可能
          

抱歉!评论已关闭.