(01背包)51nod-1085

51nod-1085

在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数)。求背包能够容纳的最大价值。
Input
第1行,2个整数,N和W中间用空格隔开。N为物品的数量,W为背包的容量。(1 <= N <= 100,1 <= W <= 10000)
第2 - N + 1行,每行2个整数,Wi和Pi,分别是物品的体积和物品的价值。(1 <= Wi, Pi <= 10000)
Output
输出可以容纳的最大价值。
Input示例
3 6
2 5
3 8
4 9
Output示例
14

01背包,就是有n个物品,每个物品有体积,有价格,

有一个固定体积的背包,

求这个背包装的物品的最大价格。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;

const int MAX_N = 100 + 5;     //物品最大的个数
const int MAX_V = 10000 + 5;   //背包最大的体积
int dp[MAX_N + 1][MAX_V + 1];
int n,bagV;                    //n个物品,背包的体积是bagV
int v[MAX_N],p[MAX_N];         //第i个物品(从0开始)的体积和价格

void solve()
{
    for(int i = 0;i < n;i ++)  //每次只考虑前i个物品
    {
        for(int j = 0;j <= bagV;j ++) //用 j 体积的背包去装前i个物品,
        {
            if(j < v[i])            // 如果第i个物品的体积太大,大于背包的体积 j,那么这个物品一定不装进去,
                dp[i + 1][j] = dp[i][j];  //此时和背包体积为j时装 (i-1)个物品的价格相同。
            else                   //如果第i个物品可以装进去,比较放入和不放入两种情况
                dp[i + 1][j] = max(dp[i][j],dp[i][j - v[i]] + p[i]); // dp[i][j - v[i]] + p[i] 放入,所以要留出v[i]的体积,
        }                 //dp[i][j - v[i]] + p[i] 背包还有v[i],体积时装(i - 1)个物品的最大价值,再加上第i个物品的价值p[i],
    }
    printf("%d\n",dp[n][bagV]);
}
int main(){ cin>>n>>bagV; for(int i = 0;i < n;i ++) cin>>v[i]>>p[i]; solve(); return 0;}

猜你喜欢

转载自blog.csdn.net/qq_41003528/article/details/80215122