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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章