贪心算法之背包可拆

直接上代码:

package com.贪心算法;

import java.util.Iterator;
import java.util.Scanner;

public class Bag72 {
	public static void main(String[] args) {
		float[] price = new float[100];  //意见物品能产生的收益
		float[] weight = new float[100];  // 一件物品的重量
		float[] x = new float[100];       // 是否装入  0<=x<=1
		float allweight = 0 ,shenyuweight  ,allprice = 0 ;
		int i = 0;
		//allweight为背包总重量
		//,shenyuweight表示背包还可以装下的重量
		//allprice  总收益
		int count ;  //总的物品数量
		Scanner scanner = new Scanner(System.in);
		System.out.println("输入物品数量:");
		count = scanner.nextInt();
		System.out.println("输入背包总重量:");
		allweight = scanner.nextFloat();
		
		for ( i = 0; i <count; i++) {
			price[i] = scanner.nextFloat();
			weight[i] = scanner.nextFloat();
		}
		
		/*
		 * 求出一件物品的平均单位的价值 : price[i]/weight[i] 再对平均价值排序    ,
		 * 变成了  price[i]*weight[i]<price[j]*weight[j]  冒泡排序  
		 * */
		for( i = 0;i < count - 1;i++){
			for (int j = i+1 ;  j < count; j++) {
				if(price[i]*weight[i]<price[j]*weight[j]){
					float temp = price[i]; price[i] = price[j] ;price[j] = temp;
					temp = weight[i] ;weight[i] = weight[j] ;weight[j] = temp;
				}
			}
		}
		shenyuweight = allweight ;  //初始背包剩余可以装入的重量为背包重量
		for( i = 0;i < count ;i++){   
			if(weight[i]>shenyuweight){  //直到不能装入退出循环
				break;
			}
			//贪心算法,将能装入的全部装入,整个装入。
			x[i] = 1 ;shenyuweight -= weight[i] ;allprice+=price[i] ;   
		}
		
		//如果可以装入,但是不能整个装入
		x[i] =(float)(shenyuweight/weight[i]);  //此时的x[i]接着上面的x[i]
		allprice = x[i]*price[i] ;
		
		for (i = 0;i < count ;i++) {
			if(x[i]<1){
				break;
			}else{
				System.out.println("装入的重量为:"+weight[i]+"/t 价值为:"+price[i]);
			}			
		}
		if(x[i]>0 && x[i] < 1){  //能装入,但不能整个装入
			System.out.println("装入的重量为:"+x[i]*weight[i]+"\t 效益为:"+price[i]*x[i]+"是原来的"+x[i]);
		}
		System.out.println("一共装入"+allweight+"\t 收益为"+allprice);
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值