多重背包问题🌟🌟🌟

多重背包问题

有 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

发表评论

后才能评论