贪心算法-背包问题

贪心算法的特点:就是按照最优解解决实际问题贪心算法在每一步的选择中,都选择当时最佳的情况。即局部最优的选择。贪心算法并不能保证总能得到最优解,但是很多问题确实可以求得最优解

心得:本次实验自己亲自通过java编写,因暑假过后,很多知识点都忘了,比如这里用的comparable接口
,进行对象的自定义排序的时候,不知道 返回的-1,0,1 返回时候的状态是大还是小,Comparator接口时候出现很多错误,于是复习了comparable接口的实现和运用,

1.0
在分配对象数组空间的时候出现空指针异常,发现在34行,一直对这个输入输出,和对象的赋值更改,但是却忘了,对象数组分配的时候没有把空间分配给对象,导致对象数组出现空指针异常,无法对对象空间进行内存的分配
在这里插入图片描述在这里插入图片描述

  1. 2.0

    给对象数组分配了内存,并且分配了动态的对象数组,这样内存不会多于的分配 在这里插入图片描述

  2. 3.0

    在对背包空间分配时,忘记了对else语句break,这样会出现在对第五组数据分配后,背包满了后,还继续分配背包空间,导致数据又多了一组,就是出错的一组
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 4.0

    实际问题中还有很多Exception,没有一一截图保存,主要就是排序重写comparable接口的问题,因为这个如果写不好,那么后面计算一定会出错

  4. 5.0

    实验和结果截图

6.0


package cn.nyist;

import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

public class BeiBao01 {
	int n;//物品数量
	double m;//承载力
	static double sum; //已经承载jiazhi

	
	
	
	public static void main(String[] args) {
		
		
		System.out.println("请输入宝贝数量");
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		Info info[] = new Info[n];
		for(int i=0; i<n; i++) {
			info[i] = new Info();
		}
		
		
		System.out.println("请输入承载力");
		double  m = scanner.nextInt();
		System.out.println(m);

//		System.out.println("总共物品数量");
//		int mn = scanner.nextInt();
		
		for(int i=0; i<n;i++) {
			System.out.println("请输入"+(i+1)+"单物体的重量,价值");
			info[i].weight =scanner.nextDouble();
			info[i].value = scanner.nextDouble();
			info[i].xingJia =info[i].value/info[i].weight;
		}
		
		Arrays.sort(info);
		System.out.println(info);
		System.out.println(Arrays.toString(info));
		for(int i=0; i<n; i++) {
			if(info[i].weight<m) {
				m = m-info[i].weight; //剩余的空间
				sum += info[i].value; //已经有的价值和
				System.out.println(sum+"aaa");
			}
//			if(info[i].weight>m) {
			else {
				
				sum += m*info[i].xingJia;
				System.out.println(sum+"bbb");
				break;
			}
			
		}
		
		System.out.println("总价值"+sum);
		
       
		
	}



	


	
}
class Info implements Comparable{
	double weight;//单个物体的重量
	double value;//单物价值
	double xingJia;//性价比
	@Override
	public String toString() {
		return "Info [weight=" + weight + ", value=" + value + ", xingJia=" + xingJia + "]";
	}
	public Info() {
		super();
		// TODO Auto-generated constructor stub
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
	public double getValue() {
		return value;
	}
	public void setValue(double value) {
		this.value = value;
	}
	public double getXingJia() {
		return xingJia;
	}
	public void setXingJia(double xingJia) {
		this.xingJia = xingJia;
	}
//	@Override
//	public int compareTo(Info o) {
//		int a =(int) (o.xingJia-this.xingJia);
//		return a;
//	}
	@Override
	public int compareTo(Object o) {
		// TODO Auto-generated method stub

		if (o instanceof Info) {
			Info s = (Info) o;
			if (this.xingJia > s.xingJia) {
				return -1;
			} else if (this.xingJia == s.xingJia) {
				return 0;
			} else {
				return 1;
			}
		}
		return 0;
	
}}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值