2.2最优装载问题
import java.util.Scanner;
import java.util.Arrays;
public class Test2_2 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入载重量c及古董个数n:");
int c=scanner.nextInt(); //载重量
int n=scanner.nextInt(); //古董个数
int[] weight=new int[n];
System.out.println("请输入每个古董的重量:");
for(int i=0;i<n;i++)
weight[i]=scanner.nextInt();
Arrays.sort(weight);
int temp=0; //记录装载到船上的古董重量
int answer=0; //记录已装载的古董个数
for(int i=0;i<n;i++) {
temp+=weight[i]; //贪心策略:每次装入最轻者
if(temp<=c) //若加入最轻者后还小于载重量,则古董个数+1
answer++;
else
break;
}
System.out.println("能装入的古董最大数量为answer="+answer);
scanner.close();
}
}
程序运行结果如下:
2.3背包问题
/*阿里巴巴与四十大盗——背包问题*/
import java.util.Scanner;
class three {
double w=0; //每个宝物的重量
double v=0; //每个宝物的价值
double p=0; //性价比
}
public class Test2_3 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入宝物数量n及毛驴的承载能力m:");
int n=scanner.nextInt(); //表示n个宝物
double m=scanner.nextDouble(); //表示毛驴的承载能力
System.out.println("请输入每个宝物的重量和价值,用空格分开:");
three[] s=new three[n]; //定义n长的数组存放宝物,数组类型是three型,即数组每位由重量、价格和性价比组成
for(int i=0;i<n;i++) {
s[i]=new three();
s[i].w=scanner.nextDouble();
s[i].v=scanner.nextDouble();
s[i].p=s[i].v/s[i].w;
}
selectionSort(s);
double sum=0; //表示贪心记录运走宝物的价值之和
for(int i=0;i<n;i++) {
if(m>s[i].w) { //如果宝物的重量小于毛驴剩下的承载能力
sum+=s[i].v; //宝物价值之和增加
m-=s[i].w; //毛驴承载能力减少
}
else { //如果宝物的重量大于毛驴剩下的承载能力,则进行部分装载
sum+=m*s[i].p; //价值增加部分重量的价值
break;
}
}
System.out.println("装入宝物的最大价值Maximum value="+sum);
scanner.close();
}
public static void selectionSort(three[] array){ //运用选择排序将宝物按照性价比由大到小进行排序
three temp=new three();
for(int i=0;i<array.length-1;i++){
for(int j=i+1;j<=array.length-1;j++){
if(array[i].p<array[j].p){
temp = array[i]; //要将类的所有成员变量进行换位置,因为值是相互对应的
array[i] = array[j];
array[j] = temp;
}
}
}
}
}
程序运行结果如下:
2.4会议安排
import java.util.Scanner;
class Meet{
int beg;