背包问题

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("  ");
}

}





}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值