動態規劃-----完全揹包

題目
有N種物品和一個容量爲V的揹包,每種物品都有無限件可用。
第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。

分析:仔細看這道題目,我們會發現,這個題目與簡單的揹包問題,有一個區別便是   簡單的揹包的問題,物品只能取一次,而這個便不規定取得次數,僅此區別
那麼我們針對這個區別如何在  以前原來的基礎上做一添加呢?   答案很簡單就是在以前的狀態轉移方程式上做一個小小的修改
w[i]爲i編號的重量    v[i]爲i編號的價值
01揹包: dp[x][y]=max(dp[x-1][y],dp[x-1][y-w[i]]+v[i]);
現在的揹包問問題的:  dp[x][y]=max(dp[x-1][y-w[i]*k]+v[i]*k|k屬於區間[0,y-w[i]*k>=0]);
只是在原有的基礎上多了一個變量k   那麼這道題目我們就十分明瞭了
#include <iostream>

using namespace std;

int main()
{
    int n,v,a[50][2],dp[50][50];
    cin>>n>>v;
    for(int i=1;i<=n;i++)cin>>a[i][0]>>a[i][1];
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=v;j++)
        {
            for(int k=0;j-k*a[i][0]>=0;k++)
            {
                dp[i][j]=max(dp[i][j],dp[i-1][j-k*a[i][0]]+k*a[i][1]);
            }
        }
    }
    cout<<dp[n][v];
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章