📜  门| GATE-CS-2009 |问题 4(1)

📅  最后修改于: 2023-12-03 14:58:28.326000             🧑  作者: Mango

题目描述

门(GATE)是在印度国内和国际上最受欢迎的计算机科学和信息技术学科的研究生入学考试,门在印度国内和国际上都有很高的声誉。GATE-CS-2009题目4是门考试中的一道题目,这道题目需要编写一个C++程序来实现一些算法。

问题描述

有一些物品,每个物品都有一个重量和一个收益。给定一定的背包容量,我们的任务是找到一个最优组合,使得在背包容量限制下,我们可以获得的收益最大化。你可以将整数机制用于背包容量和重量/收益。

请编写一个C++程序,在给定的一些物品和背包容量下,找到能获得的最大收益。

输入格式

  • 第一行包含两个整数 $n$ 和 $W$,分别表示物品数量和背包容量。
  • 接下来 $n$ 行,每行包含两个整数 $w_i$ 和 $p_i$,分别表示第 $i$ 个物品的重量和收益。

输出格式

输出能够获得的最大收益。

样例输入

3 50
10 60
20 100
30 120

样例输出

220

解题思路

这是一个经典的背包问题,我们可以使用动态规划算法来解决。假设我们已经使用前 $i$ 个物品得到了质量为 $w$ 的最大价值 $dp[i][w]$,那么下一个物品可以选择将它放入背包中或不放入背包中。如果将它放入背包中,那么我们可以获得价值 $p_i$ 和空间 $w_i$,因此我们需要在左上角找到重量为 $w_i$ 的最优解,并在此基础上加上 $p_i$。否则,我们只需要将前 $i-1$ 个物品放入背包中,它们所占用的重量不能超过 $w$。因此,我们只需要将 $dp[i-1][w]$ 作为 $dp[i][w]$ 的值。

具体的动态规划转移方程式如下:

$$ dp[i][w] = \begin{cases} 0 & w=0 \ dp[i-1][w] & w \lt w_i \ \max(dp[i-1][w], dp[i-1][w-w_i]+p_i) & w \geq w_i \end{cases} $$

在我们填写了 $dp$ 数组后,我们的答案就是 $dp[n][W]$。

参考代码

#include <iostream>
using namespace std;

int main() {
    int n, W;
    cin >> n >> W;
    int w[n+1], p[n+1];
    for (int i = 1; i <= n; i++) {
        cin >> w[i] >> p[i];
    }
    int dp[n+1][W+1];
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= W; j++) {
            if (i == 0 || j == 0) {
                dp[i][j] = 0;
            } else {
                if (j < w[i]) {
                    dp[i][j] = dp[i-1][j];
                } else {
                    dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+p[i]);
                }
            }
        }
    }
    cout << dp[n][W] << endl;
    return 0;
}