0-1揹包

題目描述

有 n 件物品, 每件物品有一個價值和一個重量,分別記爲: b1,b2, …bn w1,w2, …wn 其中所有的 重量wi 均爲整數。 現有一個揹包,其最大載重量爲W,要求從這n件物品中任取若干件(這些物品要麼被裝入要麼被留下)。問揹包中裝入哪些物品可使得所裝物品的價值和最大?

輸入

第1行:2個整數Num(1<=Num<=1000)和Wsum(1<=Wsum<=10000),分別表示物品的件數和揹包的最大載重量。
第2-n+1行:每行2個用空格分開的整數,第i+1行的整數表示第i件物品的重量Wight i和價值Price i(1<=Price i,Weight i<=10000)。

輸出

輸出只有1行:1個整數,表示揹包所能裝下的物品的最大總價值。

樣例輸入

4 5
2 3
3 4
4 5
5 6

樣例輸出

7
1 2 3
2 3 4

分析

這是一道簡單的DP題; 首先我們定義數組Weight[i]Price[i]分別表示重量與價值,
用Max_dp[i]表示重量不超過i的最大價值。
這樣,不難求出狀態轉移方程:
Max_dp[j]=max(Max_dp[jWeight[i]]+Price[i],Max_dp[j]);
(1<=i<=Num) (Wsum>=j>=Weight[i])

代碼

#include<cstdio>
#include<algorithm>
using namespace std;
const int S_Z=1000;
int Weight[S_Z+5],Price[S_Z+5],Max_dp[S_Z*10+5];
int main()
{
    int Num,Wsum;
    scanf("%d%d",&Num,&Wsum);
    for(int i=1;i<=Num;i++)
        scanf("%d%d",&Weight[i],&Price[i]); 
    for(int i=1;i<=Num;i++)
        for(int j=Wsum;j>=Weight[i];j--)
                    Max_dp[j]=max(Max_dp[j-Weight[i]]+Price[i],Max_dp[j]);
    printf("%d\n",Max_dp[Wsum]);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章