01背包的贪心算法(物品可拆分)

import java.util.Scanner;

public class Shuisou {

public static int p[]=new int[20];
public static int w[]=new int[20];
public static double temp[]=new double[20];
public static void main(String args[]){
	 Scanner in = new Scanner(System.in);
	 int m=in.nextInt();
	 int cap=in.nextInt();
	 for(int i=0;i<m;i++){
		w[i]=in.nextInt();
		p[i]=in.nextInt();
	 }
	 for(int i=0;i<m;i++){
		 temp[i]=p[i]*1.0/w[i];
		
	 }
	 int s;
	s=ff(temp,m);
	int sum=0;
	sum=w[s]+sum;
	double total=0;
	total=total+p[s];
	int mm=0;
	temp[s]=0;
	 System.out.println(total);
	//每次装单位质量最大的
	while(sum<=cap&&mm<m-1){
		 s=ff(temp,m);
		 temp[s]=0;
		
		 sum=w[s]+sum;
		 if(sum<=cap){
			 total=total+p[s];
		 }
		 System.out.println(total);
		
		 mm++;
	}
	//判断是否装满
	 if(cap>sum-w[s]){
		 int cha=cap-sum+w[s];
		 
		 double least=cha*1.0/(w[s]*1.0)*(p[s]);
		 total=total+least;
	 }
	 System.out.println(total);
	
}

public static int ff(double[] temp2,int m){
	double max=temp2[0];
	int k=0;
	for(int i=1;i<m;i++){
		if(max<temp[i]){
			max=temp[i];
			k=i;
		}
	}
	temp[k]=0;
	return k;
	
}

}

转载于:https://my.oschina.net/u/2511906/blog/875057

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值