Hdu2191珍惜現在,感恩生活(多重揹包,模板)

nupt_twoFish發表於2018-03-19

http://acm.hdu.edu.cn/showproblem.php?pid=2191

思路分析:典型的多重揹包問題,開設一維陣列dp[],維數maxn便是最大價值量,之後按照上述思路雙重迴圈便是,dp[maxn]所對應的便是所能買到的最大情況。

dp[k]表示可以使用的價值量(理解為揹包,可用體積)的時候,物品的最大價值量,
dp[i]=max{dp[i],dp[k-v[i]]+w[i]},分兩種情況,

其實我們可以把多重揹包看成01揹包,每種物品進行n次的情況。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int main()
{
    int T,n,m;
    int v[105],w[105],num[105],dp[105];
    cin>>T;
    while(T--)
    {
    //m代表總共金額,n代表大米的種類
        cin>>m>>n;
        for(int i=0;i<n;i++)
   //v[i]一袋大米的金額,w[i]一袋的重量,num[i]每種的數目。
            cin>>v[i]>>w[i]>>num[i];
        memset(dp,0,sizeof(dp));
        for(int i=0;i<n;i++)
            for(int j=0;j<num[i];j++)
                for(int k=m;k>=v[i];k--)
                    dp[k]=max(dp[k],dp[k-v[i]]+w[i]);
        cout<<dp[m]<<endl;
    }
    return 0;
}

相關文章