问题描述:当前有一个包可以装150kg,现在分别有以下物品可以装
重量35kg 价值10
重量30kg 价值40
重量60kg 价值30
重量50kg 价值50
重量40kg 价值35
重量10kg 价值40
重量25kg 价值30
将需要使用到的参数创建出来
对性价比排序
既然性价比都排序了,那它的下标也应该跟着走
排序好的重量和价值分别存在数组
将结果打印出来
运行结果
源码:
public class PackageGreedy{
private int WEIGHT_PACKAGE=150;
private int[] weights={35,30,60,50,40,10,25};
private int[] values={10,40,30,50,35,40,30};
public void packageGreedy(int capacity,int weights[],int[] values){
int n=weights.length;
double[] r=new double[n]; //性价比数组
int[] index=new int[n]; //性价比排序物品的下标
for (int i = 0; i < n; i++) {
r[i]=(double) values[i]/weights[i];
index[i]=i; //默认排序
}
double temp=0; //对性价比进行排序
for (int i = 0; i < n-1; i++) {
for (int j = i+1; j < n; j++) {
if (r[i]<r[j]){
temp=r[i];
r[i]=r[j];
r[j]= temp;
int x=index[i];
index[i]=index[j];
index[j]=x;
}
}
}
//排序好的重量和价值分别存在数组
int[] w1=new int[n];
int[] v1=new int[n];
for (int i = 0; i < n; i++) {
w1[i]=weights[index[i]];
v1[i]=values[index[i]];
}
int[] x=new int[n];
int maxValue=0;
for (int i = 0; i < n; i++) {
if (w1[i]<capacity){
//还可以装得下
x[i]=1;//表示该物品被装了
maxValue+=v1[i];
System.out.println("物品"+w1[i]+"被放入包包");
capacity=capacity-w1[i];
}
}
System.out.println("总共放下的物品数量:"+ Arrays.toString(x));
System.out.println("最大价值:"+maxValue);
}
public static void main(String[] args){
PackageGreedy packageGreedy=new PackageGreedy();
packageGreedy.packageGreedy(packageGreedy.WEIGHT_PACKAGE,packageGreedy.weights,packageGreedy.values);
}
}
贪心算法的含义:永远拿的是最大价值的东西,直到拿不了为止。