package pack;
import java.util.Arrays;
import java.util.Scanner;
/*
* 代码潜在bug
* 1.
* 第46行,Need数组是float数组没有对进入的数组进行保留2位小数进行处理(虽然题中没说,但感觉是不安全的)
* */
public class Pack {
public static void main(String[] args) {
//读取控制台数据
Scanner scanner = new Scanner(System.in);
int G = scanner.nextInt();
int n = scanner.nextInt();
//变量定义
int[] Weight = new int[n];//重量
int[] Value = new int[n];//单物品总价值
float[] Need = new float[n];//需要各物品的值,初始值为0
int keyMax= 0; //最大单价数组下表
float totalValue=0;//背包所带物品的最大价值
//输入数据
for(int i=0;i<n;i++){
Weight[i]=scanner.nextInt();
}
for (int i=0;i<n;i++){
Value[i] = scanner.nextInt();
}
//各物品单价(一斤多少钱)
float Price[] = new float[n];
for (int i=0;i<n;i++){
Price[i] =(float) Value[i]/Weight[i];
}
//核心
while (true){
keyMax = FindMax(Price,n);//接收返回值
if(Weight[keyMax]<G){//当单价最大的物品的总重量小于背包可容纳最大值时
G=G-Weight[keyMax];//修改背包容量最大值
Need[keyMax]=1;//将价值最大的物品全部放入背包
Price[keyMax]=0;//消除最大值
totalValue =(float) Value[keyMax]+totalValue;//增加背包总价值
continue;
}
if (Weight[keyMax]>G){//当单价最大的物品大于背包可容纳最大值时
Need[keyMax]=(float)G/Weight[keyMax];//算出放入背包多少该物品
totalValue =(float) Need[keyMax]*Value[keyMax] + totalValue;//增加背包总价值
G=0;//修改背包容量
}
if (G==0){
break;
}
}
//结果输出
System.out.println("各物品个取:"+Arrays.toString(Need));
System.out.println("物品总价值:"+totalValue);
}
//找出Price(单价)最大的,返回下标
static int FindMax(float[] Price,int n){
float MAX=Price[0];
int key = 0;
for(int i=1;i<n;i++){
if(Price[i]>MAX){
MAX=Price[i];
key=i;
}
}
return key;
}
}
贪心算法背包问题java
最新推荐文章于 2022-12-05 09:38:06 发布