poj-1014-多重背包+二进制优化

题意:有分别价值为1,2,3,4,5,66种物品,输入6个数字,表示相应价值的物品的数量,问一下能不能将物品分成两份,是两份的总价值相等,其中一个物品不能切开,只能分给其中的某一方,当输入六个0是(即没有物品了),这程序结束,总物品的总个数不超过20000。

做法:

多重背包+二进制优化。

注意:

1,注意初始化dp为-1,dp[0]=0;

2,注意理清各个变量代表的含义。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define INT_MAX 0x7fffffff
#define INF 999999
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)=weight;v--)
    {
        dp[v]=max(dp[v],dp[v-weight]+cost);
        if(dp[v]==s/2)
        {
            leap=1;
            return ;
        }
    }
}
void mul(int cost,int num)
{
    if(cost*num>s/2)
    {
        num=(s/2)/cost;
    }
    int k=1;
    while(k


你可能感兴趣的:(poj-1014-多重背包+二进制优化)