兰聪


私信TA

用户名:lc2024228712

访问量:3177

签 名:

等  级
排  名 156
经  验 7205
参赛次数 8
文章发表 18
年  龄 0
在职情况 学生
学  校 鄂州职业大学
专  业

  自我简介:

解题思路: 用动态规划算法
参考代码:

import java.util.Scanner;

public class 背包02 {

	public static void main(String[] args) {
		// 给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个.
		// 输入的第一行包含两个整数n, m,分别表示物品的个数和背包能装重量。
		// 以后N行每行两个数Wi和Vi,表示物品的重量和价值
		
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt(); // 物品个数
		int m = sc.nextInt(); // 背包能装的重量
		
		int[] w = new int[n]; // 背包中每个物品的重量
		int[] val = new int [n];  // 背包中每个物品的价值
		
		for (int i = 0; i < n; i++) {
			w[i] = sc.nextInt();
			val[i] = sc.nextInt();
		}
		
		int[][] v = new int [n+1][m+1]; // 加1表示第一行和第一列都要是0
		
		// 动态规划
		for (int i = 1; i < v.length; i++) { // 从1开始表示不处理第一行和第一列
			for (int j = 1; j < v[0].length; j++) {
				if(w[i-1] > j) { // 如果商品大于当前的承重那么就等于正上方单元格的值(不会描述,随便理解理解)
					v[i][j] = v[i-1][j];
				}else if(j >= w[i-1]) { // 如果还有多余的容量就选一个最大值(也是不会描述)
					v[i][j] = Math.max(v[i-1][j], val[i-1] + v[i-1][j-w[i-1]]);
				}
			}
		}
		
		// 用来看表格的
//		for (int i = 0; i < v.length; i++) {
//			for (int j = 0; j < v[i].length; j++) {
//				System.out.print(v[i][j] + " ");
//			}
//			System.out.println();
//		}
		
		System.out.println(v[n][m]);
		
	}

}

上面的看不清楚 附上一个无注释版

import java.util.Scanner;

public class 背包02 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		
		int[] w = new int[n];
		int[] val = new int [n];
		
		for (int i = 0; i < n; i++) {
			w[i] = sc.nextInt();
			val[i] = sc.nextInt();
		}
		
		int[][] v = new int [n+1][m+1];
		
		for (int i = 1; i < v.length; i++) {
			for (int j = 1; j < v[0].length; j++) {
				if(w[i-1] > j) {
					v[i][j] = v[i-1][j];
				}else if(j >= w[i-1]) {
					v[i][j] = Math.max(v[i-1][j], val[i-1] + v[i-1][j-w[i-1]]);
				}
			}
		}
		
		System.out.println(v[n][m]);
		
	}

}


 

0.0分

6 人评分

  评论区

  • «
  • »