算法竞赛入门经典 例题9-5 0-1 背包

/*算法竞赛入门经典 例题 9-5 0-1背包问题
 * f(i,j) 表示 “把前i个物品装到容量为j的背包的最大总重量”
 * f(i,j) = max{f(i-1,j),f(i-1,j-v[i])+w(i)}
 * n 表示物品个数  c表示物品容量
 * */
import java.util.Scanner;

public class Package01 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();// 物品个数
		int[] v = new int[n + 1]; // v[i]物品i的体积
		int[] w = new int[n + 1];// w[i] 物品i的重量
		int c = scanner.nextInt();// 容器容量
		int[][] f = new int[n + 1][c + 1];
		int[][] max = new int[n + 1][c + 1];
		for (int i = 1; i <= n; i++) {
			v[i] = scanner.nextInt();
			w[i] = scanner.nextInt();
			for (int j = 0; j <= c; j++) {
				f[i][j] = (i == 1 ? 0 : f[i - 1][j]);// f[1][j]默认就是0 这里是为了强调
				if (j >= v[i]) {
					if (f[i][j] < f[i - 1][j - v[i]] + w[i]) {
						f[i][j] = f[i - 1][j - v[i]] + w[i];
						max[i][j] = 1;
					}
				}
			}
		}
		System.out.println(f[n][c]);
		// 递归打印
		Package01 p = new Package01();
		p.print(max, n, c, f, w, v);
		System.out.println();
		// 递推打印
		int m = f[n][c];
		int i = n, j = c;
		while (m > 0) {
			if (max[i][j] == 1) {
				System.out.printf("%d ", w[i]);
				m -= w[i];
				j -= v[i];
				i--;
			} else {
				i--;
			}
		}
	}

	private void print(int[][] max, int i, int j, int[][] f, int[] w, int[] v) {
		if (i == 0)
			return;
		if (max[i][j] == 1) {
			System.out.printf("%d ", w[i]);
			print(max, i - 1, j - v[i], f, w, v);
		} else {
			print(max, i - 1, j, f, w, v);
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值