📜  无界分数背包(1)

📅  最后修改于: 2023-12-03 15:10:27.268000             🧑  作者: Mango

无界分数背包

无界分数背包是动态规划中的一种经典问题。它是一种背包问题,但与0/1背包和完全背包不同,每种物品都有无限个可用。

问题描述

给定一个重量为W的背包和n种物品,每种物品有无限个可用,第i种物品的重量为wi,价值为vi。求解将哪些物品装入背包可以使这些物品的总重量不超过W,且价值总和最大。

算法思路

无界分数背包可以使用动态规划来求解。设dp[i]表示总重量为i的背包可以获得的最大价值,则有转移方程:

dp[i] = max(dp[i], dp[i-w[j]] + v[j]) (i >= w[j])

其中,w[j]为第j种物品的重量,v[j]为第j种物品的价值。

需要注意的是,转移方程中的i-w[j]并不一定是小于i的。这是因为每种物品有无限个可用,所以可以不断地加入某种物品,总重量可以超过原本的背包重量W。

代码实现

C++代码实现:

vector<int> w(n), v(n); // 物品的重量和价值
vector<int> dp(W+1); // dp数组
for (int i = 0; i < n; ++i) {
    for (int j = w[i]; j <= W; ++j) {
        dp[j] = max(dp[j], dp[j-w[i]] + v[i]);
    }
}

Python代码实现:

w = [2, 3, 4, 7] # 物品的重量
v = [1, 3, 5, 9] # 物品的价值
dp = [0] * (W+1) # dp数组
for i in range(n):
    for j in range(w[i], W+1):
        dp[j] = max(dp[j], dp[j-w[i]] + v[i])

以上代码实现均为完整代码,需要将问题中的参数和变量进行替换后才能运行。