动态规划:01背包问题

简介: 动态规划:01背包问题

题目描述

给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个.


输入格式

输入的第一行包含两个整数n, m,分别表示物品的个数和背包能装重量。

以后N行每行两个数Wi和Vi,表示物品的重量和价值


输出格式

输出1行,包含一个整数,表示最大价值。

样例输入

3 5

2 3

3 5

4 7


样例输出

8

使用二维数组:

#include<iostream>
using namespace std;
const int N = 1010;
int dp[500][10000];
int w[10005];   //重量
int v[10005];   //价值
int n, m;
int main()
{
    int i, j;
    cin >> n >> m;
    for (i = 1; i <= n; i++)
    {
        cin >> w[i] >> v[i];
    }
    for (i = 1; i <= n; i++)
    {
        for (j = 0; j <= m; j++)
        { 
            dp[i][j] = dp[i - 1][j];
            if (j >= w[i])
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
        } 
    }
    cout << dp[n][m] << endl;
    return 0;
}

使用一维数组:

#include<iostream>
using namespace std;
const int N = 1010;
int dp[10000];
int w[10005];
int v[10005];
int n, m;
int main()
{
    int i, j;
    cin >> n >> m;
    for (i = 1; i <= n; i++)
    {
        cin >> w[i] >> v[i];
    }
    for (i = 1; i <= n; i++)
    {
        for (j = m; j >= w[i]; j--)
        { 
            dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
        } 
    }
    cout << dp[m] << endl;
    return 0;
}
目录
相关文章
动态规划之01背包问题和完全背包问题
动态规划之01背包问题和完全背包问题
|
7月前
01背包-动态规划
01背包-动态规划
33 0
|
10月前
|
算法 C语言 C++
【动态规划】背包问题(01背包,完全背包)
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
103 0
|
11月前
动态规划——01背包问题、完全背包问题
动态规划——01背包问题、完全背包问题
69 0
|
算法 JavaScript 前端开发
动态规划-01背包
前言 动态规划和递归是一对CP,递归通过将大问题分解成小问题以求得答案,而动态规划则是通过求解小问题来组成大问题的解。虽然其本质都是先求小问题的解,但是问题的推算不同:
背包问题——01背包|完全背包 2
背包问题——01背包|完全背包
145 0
|
测试技术 容器
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(三)
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(三)
173 0
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(三)
|
JavaScript 测试技术 vr&ar
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(一)
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(一)
116 0
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(一)