首页 > 试题广场 >

01背包

[编程题]01背包
  • 热度指数:6856 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解

现有一个容量大小为V的背包和N件物品,每件物品有两个属性,体积和价值,请问这个背包最多能装价值为多少的物品?


输入描述:
第一行两个整数V和n。
接下来n行,每行两个整数体积和价值。1≤N≤1000,1≤V≤20000。
每件物品的体积和价值范围在[1,500]。


输出描述:
输出背包最多能装的物品价值。
示例1

输入

6 3
3 5
2 4
4 2

输出

9
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int V = scanner.nextInt();
        int N = scanner.nextInt();
        int[][] bag = new int[N][2];
        for(int i = 0; i < N; i++) {
            bag[i][0] = scanner.nextInt();
            bag[i][1] = scanner.nextInt();
        }
        int[] dp = new int[V+1];//背包容量为v最大能存放多少价值的物品dp[v]
        for(int i = 0; i < N; i++) {
            for(int j = V; j >= bag[i][0]; j--) {
                dp[j] = Math.max(dp[j], dp[j-bag[i][0]] + bag[i][1]); //比较,放不放物品i的价值
            }
        }
        System.out.println(dp[V]);
    }
}
发表于 2021-08-17 17:29:00 回复(0)
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int capicaty = sc.nextInt();
        int nums = sc.nextInt();
        int[] w = new int[nums + 1];
        int[] v = new int[nums + 1];
        for(int i = 1; i < nums + 1; i++){
            w[i] = sc.nextInt();
            v[i] = sc.nextInt();
        }
        int[][] dp = new int[nums + 1][capicaty + 1];
        for(int i = 1; i < nums + 1; i++){
            for(int j = 1; j <= capicaty; j++){
                if(w[i] > j){
                    dp[i][j] = dp[i - 1][j];
                }else{
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
                }
            }
        }
        System.out.println(dp[nums][capicaty]);
    }
}

发表于 2019-08-16 15:29:50 回复(0)