背包问题和部分背包问题的区别:
- 背包问题在最后一个的选择的时候,如果背包容量小于下一个放入物品的容量(且全部物品的容量大于背包容量)则不再放入。
- 部分背包问题在最后一个物品选择的时候,若背包容量仍然可以放下部分物品,则将部分物品放入。
public class FK {
/*
商品数量 n,各商品的价值 p,各商品的体积 v,背包容量C, 商品性价比Ratio[1,n]
*/
public static void main(String[] args) {
System.out.println("name value volume cost_per");
String[] name = {"汽水 ", "橙汁 ", "苹果汁", "苏打水", "西瓜汁"};
int[] p = {10, 16, 60, 36, 45};
int[] v = {250, 100, 600, 200, 300};
double[] Ratio = new double[p.length];//性价比
int n = p.length;
int C = 800;
for (int b = 0; b < n; b++) {
Ratio[b] = (double) p[b] / v[b];//性价比=价格/体积
}
Juice juice = new Juice();
//创建对象数组
Juice[] j = new Juice[n];//传入n个数据
for (int i = 0; i < n; i++) {
j[i] = new Juice(name[i], p[i], v[i], Ratio[i]);
}
Juice j1 = null;
for (int i = 0; i < p.length; i++) {//冒泡排序
for (int d = 0; d < p.length; d++) {
if (d != p.length - 1)//这里必须加上这个条件,不然数字会报出越界的问题
if (j[d].getCost_per() < j[d + 1].getCost_per()) {
j1 = j[d + 1];
j[d + 1] = j[d];
j[d] = j1;
}
}
}
for (int a = 0; a < n; a++) {//打印排序之后
System.out.println(j[a].getJuiceName() + "\t" + j[a].getValue() + "\t" + j[a].getVolume() + "\t" + j[a].getCost_per());
}
int i = 0;
double ans = 0.00;
System.out.print("选择商品:");
while (C > 0 && i < n) {
if (j[i].getVolume() <= C) {//如果体积小于背包容量就选择
System.out.print(j[i].getJuiceName() + ",");
ans = ans + j[i].getValue();
C = C - j[i].getVolume();
} else {//还剩余C体积,但是不够(还可倒一点)
System.out.print("再选择" + C + "体积的" + j[i].getJuiceName());
double p1 = j[i].getValue();
double v1 = j[i].getVolume();
ans = ans + (p1 * (C / v1));//整数除如果个位数为0即为0
C = 0;
}
i = i + 1;
}
System.out.println("\n所选方案总价格:" + ans);
}
}