多重背包问题🌟🌟🌟
多重背包问题
有 N 件物品和一个容量是 V 的背包。第 i 件物品有 s[i] 件。
第 i 件物品的体积是 V[i],价值是 W[i]。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
代码实现
Java
import java.util.Scanner;
public class Main{
public static void main(String[] args) throws Exception {
// 读入数据的代码
Scanner reader = new Scanner(System.in);
// 物品的数量为N
int N = reader.nextInt();
// 背包的容量为V
int V = reader.nextInt();
// 一个长度为N的数组,第i个元素表示第i个物品的体积;
int[] v = new int[N + 1] ;
// 一个长度为N的数组,第i个元素表示第i个物品的价值;
int[] w = new int[N + 1] ;
for (int i=1 ; i <= N ; i++){
// 接下来有 N 行,每行有两个整数:v[i],w[i],用空格隔开,分别表示第i件物品的体积和价值
v[i] = reader.nextInt();
w[i] = reader.nextInt();
}
reader.close() ;
// 核心模式代码
int[][] dp = new int[N+1][V+1];
// 初始化
for(int i = 1; i <= N; i++){
for(int j = 0; j <= V; j++){
for(int k = 0; k <= s[i] && k*v[i] <= j; k++){
dp[i][j] = Math.max(dp[i][j], dp[i-1][j-k*v[i]] + k * w[i]);
}
}
}
System.out.println(dp[N][V]);
}
}
Java
Python
def main():
# 读入数据的代码
N, V = map(int, input().split())
v = [0] * (N + 1)
w = [0] * (N + 1)
for i in range(1, N + 1):
v[i], w[i] = map(int, input().split())
# 核心模式代码
dp = [[0 for _ in range(V + 1)] for _ in range(N + 1)]
# 初始化
for i in range(1, N + 1):
for j in range(V + 1):
for k in range(s[i] + 1):
if k * v[i] <= j:
dp[i][j] = max(dp[i][j], dp[i - 1][j - k * v[i]] + k * w[i])
print(dp[N][V])
if __name__ == "__main__":
main()
Python
C++
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 读入数据的代码
int N, V;
cin >> N >> V;
vector<int> v(N + 1), w(N + 1);
for (int i = 1; i <= N; i++) {
cin >> v[i] >> w[i];
}
// 核心模式代码
vector<vector<int>> dp(N + 1, vector<int>(V + 1, 0));
// 初始化
for (int i = 1; i <= N; i++) {
for (int j = 0; j <= V; j++) {
for (int k = 0; k <= s[i] && k * v[i] <= j; k++) {
dp[i][j] = max(dp[i][j], dp[i - 1][j - k * v[i]] + k * w[i]);
}
}
}
cout << dp[N][V] << endl;
return 0;
}
C++
Go
package main
import (
"fmt"
)
func main() {
// 读入数据的代码
var N, V int
fmt.Scan(&N, &V)
v := make([]int, N+1)
w := make([]int, N+1)
for i := 1; i <= N; i++ {
fmt.Scan(&v[i], &w[i])
}
// 核心模式代码
dp := make([][]int, N+1)
for i := 0; i <= N; i++ {
dp[i] = make([]int, V+1)
}
// 初始化
for i := 1; i <= N; i++ {
for j := 0; j <= V; j++ {
for k := 0; k <= s[i] && k*v[i] <= j; k++ {
dp[i][j] = max(dp[i][j], dp[i-1][j-k*v[i]]+k*w[i])
}
}
}
fmt.Println(dp[N][V])
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
Go