背包问题
package pratice;
import java.util.Scanner;
public class Loadmax {
//快速排序法排序返回装载量由小到大的数组下标
public static int[] quickSort(int arr[],int low,int high) {
int valueindex[]=new int[high+1];
for(int i=0;i<high+1;i++) {
valueindex[i]=i;
}
int i,j,temp,t,index;
if(low>high){
return valueindex ;
}
i=low;
j=high;
//temp就是基准位
temp = arr[low];
while (i<j) {
//先看右边,依次往左递减
while (temp<=arr[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (temp>=arr[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
index=valueindex[j];
valueindex[j]=valueindex[j+1];
valueindex[j+1]=index;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = temp;
//递归调用左半数组
quickSort(arr, low, j-1);
quickSort(arr, j+1, high);
return valueindex;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入集装箱个数:");
int num = sc.nextInt();
System.out.println("请输入船的载重量:");
int capacity = sc.nextInt();
int sheng=capacity;
int shengyu=0,totalweight=0;
int weight[] = new int[num];
int weightindex[]=new int[num];
int output[]= new int[num];
System.out.println("请输入集装箱重量:");
for(int i=0;i<num;i++) {
weight[i]=sc.nextInt();
}
for(int i=0;i<num;i++) {
output[i]=0;
}
sc.close();
//接受从小到大的排序的下标
weightindex=quickSort(weight,0,num-1);
for(int i =0;i<num;i++) {
if(weight[weightindex[i]]<=sheng) {
totalweight=totalweight+weight[weightindex[i]];
sheng=capacity-totalweight;
output[weightindex[i]]=1;
}
else {
break;//跳出循环
}
}
System.out.println("装载方案为:");
for(int i=0;i<num;i++) {
System.out.print(output[i]);
System.out.print(" ");
}
System.out.println("");
System.out.print("最大剩余载重为:");
System.out.println(sheng);
}
}
最优装载问题
package pratice;
import java.util.Scanner;
public class Bag {
//快速排序返回单位质量价值由大到小的数组下标
public static int[] quickSort(int arr[],int low,int high) {
int valueindex[]=new int[high+1];
for(int i=0;i<high+1;i++) {
valueindex[i]=i;
}
int i,j,temp,t,index;
if(low>high){
return valueindex ;
}
i=low;
j=high;
//temp就是基准位
temp = arr[low];
while (i<j) {
//先看右边,依次往左递减
while (temp<=arr[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (temp>=arr[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
index=valueindex[j];
valueindex[j]=valueindex[j+1];
valueindex[j+1]=index;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = temp;
//递归调用左半数组
quickSort(arr, low, j-1);
quickSort(arr, j+1, high);
return valueindex;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入物品个数:");
int num = sc.nextInt();
System.out.println("请输入背包容量:");
float capacity = sc.nextInt();
float sheng=capacity;
float totalvalue=0,shengyu=0,totalweight=0;
int weight[] = new int[num];
int value[] = new int[num];
int valueindex[]=new int[num];
int pervalue[]= new int[num];
float output[]= new float[num];
System.out.println("请输入物品重量:");
for(int i=0;i<num;i++) {
weight[i]=sc.nextInt();
}
System.out.println("请输入物品价值:");
for(int i=0;i<num;i++) {
value[i]=sc.nextInt();
}
sc.close();
for(int i=0;i<num;i++) {
pervalue[i]=value[i]/weight[i];
}
for(int i=0;i<num;i++) {
output[i]=0;
}
//返回单位质量价值由大到小的数组下标
valueindex=sort(pervalue,num);
for(int i =0;i<num;i++) {
if(weight[valueindex[i]]<sheng) {
totalvalue=totalvalue+value[valueindex[i]];
totalweight=totalweight+weight[valueindex[i]];
sheng=capacity-totalweight;
output[valueindex[i]]=weight[valueindex[i]];
}
else {
totalvalue=totalvalue+pervalue[valueindex[i]]*sheng;
output[valueindex[i]]=sheng;
break;//跳出循环
}
}
System.out.println("物品容量安排为:");
for(int i=0;i<num;i++) {
System.out.print(output[i]);
System.out.print(" ");
}
System.out.println("");
System.out.print("最大价值为:");
System.out.println(totalvalue);
}
}