題目描述
有 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;
}