题目
有一个国家发现了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
*/
运行截图:
如有错误或不合理的地方,敬请指正~
加油!!