背包问题 * 贪心准则:价值贪心

本文深入探讨了背包问题的解决方案,重点介绍了使用贪心准则,特别是价值贪心策略,来优化物品的选择过程。通过实例解析和代码展示,阐述如何根据物品的价值密度进行优先选择,以达到背包容量最大化的目标。
摘要由CSDN通过智能技术生成

代码

package LQB14;

import java.util.Scanner;

/*
 * 背包问题
 * 贪心准则:价值贪心
 */
public class T7 {

		public static Scanner scanner = new Scanner(System.in);
		public static int n;// 物品个数
		public static float C;// 背包容量
		public static float[] weight;// 重量数组
		public static float[] value;// 价值数组
		// 拷贝的目的是,在后面对重量数组和价值数组进行了排序,打乱了原来的数组顺序,故先拷贝出来一份。
		public static float[] v;// 拷贝一份价值数组
		public static float[] w;// 拷贝一份重量数组
		public static float[] add;// 放入的比例数组

		public static void main(String[] args) {
			// TODO Auto-generated method stub

			System.out.print("请输入物品的个数:");
			n = scanner.nextInt();
			weight = new float[n];
			value = new float[n];
			v = new float[n];
			w = new float[n];
			System.out.print("请输入背包的容量:");
			C = scanner.nextFloat();
			System.out.println("请输入物品的重量和价值:");
			for (int i = 0; i < n; i++) {
				weight[i] = scanner.nextFloat();
				value[i] = scanner.nextFloat();
				// 进行拷贝
				v[i] = value[i];
				w[i] = weight[i];
			}
			addBag();
			float total = totalValue();
			System.out.println("背包的总价值为:" + total);

		}

		/**
		 * @see 计算总价值
		 * @return 返回总价值
		 */
		public static float totalValue() {
			float total = 0;
			for (int i = 0; i < n; i++) {
				total += add[i] * value[i];
			}
			return total;
		}

		/**
		 * @see 计算物品放入的比例,放入到add数组中
		 */
		public static void addBag() {
			add = new float[n];
			// 给价值数组进行排序,价值大的在前面
			int index[] = Arraysort(value);// 对value进行了排序
			for (int i = 0; i < n; i++) {
				if (w[index[i]] <= C) {
					// 加入背包中
					add[index[i]] = 1;
					C = C - w[index[i]];
				} else {
					// 按比例加入背包中
					add[index[i]] = C / w[index[i]];

				}
			}
			System.out.print("放入重量比例:");
			for (float i : add) {
				System.out.print("\t" + i);
			}
			System.out.println();
			System.out.print("单个物品价值:");
			for (float i : value) {
				System.out.print("\t" + i);
			}
			System.out.println();
		}

		/**
		 * @see 将传进来的数组进行排序,小的在前面
		 * @param arr
		 * @return 返回原来数组的下标
		 */
		public static int[] Arraysort(float[] arr) {
			float temp;
			int index;
			int k = arr.length;
			int[] Index = new int[k];
			for (int i = 0; i < k; i++) {
				Index[i] = i;
			}

			for (int i = 0; i < arr.length; i++) {
				for (int j = 0; j < arr.length - i - 1; j++) {
					if (arr[j] < arr[j + 1]) {
						temp = arr[j];
						arr[j] = arr[j + 1];
						arr[j + 1] = temp;

						index = Index[j];
						Index[j] = Index[j + 1];
						Index[j + 1] = index;
					}
				}
			}
			return Index;
		}

	}
	



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值