演算法學習之路|蒜頭君的購物袋3

kissjz發表於2018-02-28

蒜頭君去超市購物,他有一隻容量為 V的購物袋,同時他想買 n 種物品,已知每種物品的體積 vi​ 和重要度 pi​。蒜頭君想知道,怎麼挑選物品放入購物袋中,可以使得買到的物品重要度之和最大,且物品體積和不超過購物袋的容量。注意超市中每種物品的數量無限多。

輸入格式
第一行輸入兩個整數 nn, VV (1≤n≤1,000,1≤V≤10,000)。

接下來輸入 nn 行,每行輸入兩個整數 vi​ 和 pi​ (1≤vi​,pi​≤10,000),分別表示第 i 種物品的體積和重要度。

輸出格式
輸出一行,輸出一個整數,表示能買到物品的最大重要度之和。

樣例輸入
4 20
3 7
2 5
4 6
5 9
樣例輸出
50
解題思路

由01揹包知:dpi=max(dpi-1]+p[i],dpi-1);

本題與01揹包的不同之處在於原本商品唯一,現在無數種了。

於是dpi=max(dpi-1,dpi-1]+p[i],dpi-1]+2*p[i]……);

因此,我們完全可以用dpi]來更新dpi的值。

即for(int j=v[i];j<=V;j++)

較大的容量由較小的容量來更新,且較小與較大的容量都可以重複商品,剛好不重不漏。

#include<iostream>
using namespace std;
int dp[10001];
int main(){
    int n,V;
    cin>>n>>V;
    
    int v[1001],p[1001];
    for(int i=1;i<=n;++i)   cin>>v[i]>>p[i];
    
    for(int i=1;i<=n;++i)
        for(int j=v[i];j<=V;++j)
            dp[j]=max(dp[j-v[i]]+p[i],dp[j]);
    
    cout<<dp[V];
}


相關文章