国王和金矿

题目

有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。

第一座金矿200金且需要3个人挖;

第二座金矿300金且需要4个人挖;

第三座金矿350金且需要3个人挖;

第四座金矿400金且需要5个人挖;

第五座金矿500金且需要5个人挖。

参与挖矿工人的总数是10人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要想得到尽可能多的黄金,应该选择挖取哪几座金矿?

思路

该题是动态规划的题型,由“每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿”知可以采用 01背包 思想解题。

5座金矿相当于物品,10个人相当于背包容量,最后求最大价值。

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		
		int n = cin.nextInt(); //金矿数
		int m = cin.nextInt(); //工人数
		
		int[] v = new int[n+5]; //金子数
		int[] p = new int[n+5]; //需要的人数
		int[][] f = new int[n+5][m+5]; //最大金子数
		
		//初始化
		for(int i=1; i<=n; i++) f[i][0] = 0;
		for(int i=1; i<=m; i++) f[0][i] = 0;
		
		for(int i=1; i<=n; i++) {
			v[i] = cin.nextInt();
			p[i] = cin.nextInt();
		}
		
		//求最优值
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=m; j++) {
				if(p[i] > j) f[i][j] = f[i-1][j];
				else f[i][j] = Math.max(f[i-1][j], f[i-1][j-p[i]] + v[i]);
			}
		}
		
		//求最优解
		boolean[] x = new boolean[n+5];
		for(int i=n,j=m; i>=1; i--) {
			if(f[i][j] > f[i-1][j]) {
				x[i] = true;
				j -= p[i];
			}
		}
		
		System.out.println("最大金子数:" + f[n][m]);
		System.out.print("开发的金矿编号:");
		for(int i=1; i<=n; i++) {
			if(x[i] == true)
				System.out.print(i+" ");
		}
		
		cin.close();
	}
}
/**

5 10
200 3
300 4
350 3
400 5
500 5

*/

运行截图:


如有错误或不合理的地方,敬请指正~

加油!!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值