import java.text.NumberFormat;
import java.util.Scanner;
public class Makui {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n;//物品种类
System.out.print("输入物品种类:");
Scanner s_n=new Scanner(System.in);
n=s_n.nextInt();
float c;//背包的重量
float w[]=new float[n];//物品的重量数组
float v[]=new float[n];//物品的价值数组
float avi[]=new float[n];//存储物品的单位重量的价值
int index[]=new int[n];//
System.out.print("输入背包的承载重量:");
Scanner s_c=new Scanner(System.in);
c=s_c.nextInt();
System.out.println("输入各个物品种类的重量");
for(int i=1;i<=n;i++){
System.out.print("物品"+i+":");
Scanner s_w=new Scanner(System.in);
w[i-1]=s_w.nextFloat();
}
System.out.println("输入各个物品种类的价值");
for(int j=1;j<=n;j++){
System.out.print("物品"+j+":");
Scanner s_v=new Scanner(System.in);
v[j-1]=s_v.nextFloat();
}
for(int k=0;k<n;k++){//计算物品的性价比,即:单位重量的价值
avi[k]=v[k]/w[k];
}
for(int m=0;m<n;m++){//按性价比的优越性排序之后,数组原有的数组下标变化,index[]作用是记录数组原有的数组下标
index[m]=m;
}
for(int a=0;a<n-1;a++){//对存储物品性价比的数组排序
for(int b=a+1;b<n;b++){
if(avi[b]>avi[a]){
float temp;
temp=avi[b];
avi[b]=avi[a];
avi[a]=temp;
int x=index[a];
index[a]=index[b];
index[b]=x;
}
}
}
knapsack(n,c,avi,index,w);
}
private static void knapsack(int n,float c, float[] avi, int[] index,float w[]) {
// TODO Auto-generated method stub
int i,a = 0;
int length=n;//记录物品种类
float M=c;//记录背包的总重量
double x[]=new double[length];//种类分量记录数组
for(i=0;i<length;i++){
a=index[i];
float b=w[a];
if(b>M)//某个物品的重量大于了背包的承载重量,则检验下一个物品
break;
else{
x[a]=1;
M=M-b;
}
}
if(i<length){
x[a]=(double)((M*1.0)/w[a]);
}
System.out.print("背包中各个物品种类的百分比:");
for(int k=0;k<length;k++){
//String N=x[k];
NumberFormat num = NumberFormat.getPercentInstance();
num.setMaximumIntegerDigits(3);
num.setMaximumFractionDigits(2);
System.out.print(num.format(x[k]));
System.out.print(" ");
}
}
}
import java.util.Scanner;
public class Makui {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n;//物品种类
System.out.print("输入物品种类:");
Scanner s_n=new Scanner(System.in);
n=s_n.nextInt();
float c;//背包的重量
float w[]=new float[n];//物品的重量数组
float v[]=new float[n];//物品的价值数组
float avi[]=new float[n];//存储物品的单位重量的价值
int index[]=new int[n];//
System.out.print("输入背包的承载重量:");
Scanner s_c=new Scanner(System.in);
c=s_c.nextInt();
System.out.println("输入各个物品种类的重量");
for(int i=1;i<=n;i++){
System.out.print("物品"+i+":");
Scanner s_w=new Scanner(System.in);
w[i-1]=s_w.nextFloat();
}
System.out.println("输入各个物品种类的价值");
for(int j=1;j<=n;j++){
System.out.print("物品"+j+":");
Scanner s_v=new Scanner(System.in);
v[j-1]=s_v.nextFloat();
}
for(int k=0;k<n;k++){//计算物品的性价比,即:单位重量的价值
avi[k]=v[k]/w[k];
}
for(int m=0;m<n;m++){//按性价比的优越性排序之后,数组原有的数组下标变化,index[]作用是记录数组原有的数组下标
index[m]=m;
}
for(int a=0;a<n-1;a++){//对存储物品性价比的数组排序
for(int b=a+1;b<n;b++){
if(avi[b]>avi[a]){
float temp;
temp=avi[b];
avi[b]=avi[a];
avi[a]=temp;
int x=index[a];
index[a]=index[b];
index[b]=x;
}
}
}
knapsack(n,c,avi,index,w);
}
private static void knapsack(int n,float c, float[] avi, int[] index,float w[]) {
// TODO Auto-generated method stub
int i,a = 0;
int length=n;//记录物品种类
float M=c;//记录背包的总重量
double x[]=new double[length];//种类分量记录数组
for(i=0;i<length;i++){
a=index[i];
float b=w[a];
if(b>M)//某个物品的重量大于了背包的承载重量,则检验下一个物品
break;
else{
x[a]=1;
M=M-b;
}
}
if(i<length){
x[a]=(double)((M*1.0)/w[a]);
}
System.out.print("背包中各个物品种类的百分比:");
for(int k=0;k<length;k++){
//String N=x[k];
NumberFormat num = NumberFormat.getPercentInstance();
num.setMaximumIntegerDigits(3);
num.setMaximumFractionDigits(2);
System.out.print(num.format(x[k]));
System.out.print(" ");
}
}
}