背包问题初步入门--背包2 poj1276

引言:这道题是一个多重背包问题,能够很好的说明多重背包的问题,但是由于poj要求比较严,所以,单纯的用方程式会tle所以需要剪枝操作,接下来上代码。

#include
using namespace std;
struct TBill
{
    int num,val;
};
TBill Bill[15];
int dp[100010],value[10010];
int main()
{
    int cash,n,i,j,k;
    while (cin>>cash>>n)
    {
        k=0;
        for (i=0; i>Bill[i].num>>Bill[i].val;
            j=1;
            while (j<=Bill[i].num )
            {
                value[k++]=Bill[i].val*j;
                Bill[i].num-=j;
                j*=2;  //剪枝策略
            }
            if(Bill[i].num>0)
                value[k++]=Bill[i].val*Bill[i].num;
        }
        memset(dp,0,sizeof(dp));
        for (i=0; i=0; --j)
            {
                if (j-value[i]>=0)
                    dp[j]=dp[j]>dp[j-value[i]]+value[i] ? dp[j] : dp[j-value[i]]+value[i];
            }
        }
        cout<


 

代码中的剪枝我已经注释了,但是真正理解背包的精髓,我想光靠这道题还远远不够。。。

你可能感兴趣的:(ACM)