部分背包(Fractional Knapsack)
按性价比排好序列
一个一个往进去装直到最后一个不能全装进去计算比例
JAVA
public class FractionalKnapsack { public static float[] GREEDY_KNAPSACK(int[] w,int W,int[] v) { int i; int n=w.length;//总共有多少个物品,用w.length/v.length都可以 float[] x=new float[n]; for(i=0;i<n;i++) { x[i]=0;//初始化 } float c=W;//c是包剩余容量 for(i=0;i<n;i++) { if(w[i]<=c)//如果第i个物品的重量<剩余容量 { x[i]=1;//全部取出,比例百分百 c=c-w[i];//改变剩余容量 } else break;//跳出循环 } if(i<n&&c>0) x[i]=c/w[i];//算出剩下能装的容量占这个物品的比例,也就是取出的比例 return x; } public static void PRINTARRAY(float[] array) { System.out.print("{"); for (int i = 0; i < array.length; i++) { System.out.print(array[i]); if (i < array.length - 1) { System.out.print(", "); } } System.out.println("}"); } public static void main(String[] args) { int [] A={65,20,30,60,40}; int [] B={30,10,20,50,40}; float [] x=GREEDY_KNAPSACK(B,100,A); PRINTARRAY(x); } }
輸出:{1.0, 1.0, 1.0, 0.8, 0.0}
比例不是整數改爲用float;
性價比排序現為人爲排序,待修改
时间: 2024-10-07 06:09:45