背包问题-贪心算法-JAVA

本文探讨了经典的背包问题,并提出了一种基于贪心算法的解决方案。通过对比物品的价值与重量,算法能够有效地选择装入背包的物品,以实现价值最大化。文章详细介绍了算法的实现过程,包括物品比值计算、排序和选择策略,最后展示了算法的实际运行结果。
摘要由CSDN通过智能技术生成

问题描述:给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
1.贪心算法解决
代码如下:

package 算法设计与分析;

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

public class beibao {
	public static void  Knapsack(int n, float M,float wv[][],float x[]){
		  float [] b = new float[n+1];//数组b存储物品重量与价值的比值
		   for (int i = 1; i <= n; i++) {
			wv[i][i] = wv[0][i]/wv[i][0];//对角线存储物品重量与价值的比值
			b[i] = wv[0][i]/wv[i][0];
		}
		   Arrays.sort(b);
	       int i;
	       for (i=1;i<=n;i++) x[i]=0;//x数组用来标记存储物品
	       float c=M;//c为背包容量
	       for (i=1;i<=n;i++) {//n为物品数量
	    	   for (int j = 1; j <= n; j++) {//利用对角线与b数组确定放入背包的物品
	    		if (wv[0][j]>c) break;
				if(b[i]==wv[j][j]) {
					x[j]=1;
					c -= wv[0][j];
						}	
	    	   		}
	          }
	       if (i<=n) 
	    	   for (i=1;i<=n;i++)
	    		   for (int j = 1; j <= n; j++) {
	    			   if(b[i]==wv[j][j])
	    				   x[j]=c/wv[0][j];//最后一个物品运行部分转入
	    		   }
	       System.out.println("装入物品的位置及数量:");
	       for(int j=1;j<=n;j++)
	    	   if(x[j]==1||x[j]==0)
	    	   System.out.print((int)x[j]+" ");
	    	   else {
	    		   System.out.print(x[j]);
			}
	       System.out.println();
		   Solve(wv,x,n);
		   
	}

public static void Solve(float p[][],float q[],int m){//计算装入背包的总价值
		float sum = 0;
		for(int i=1;i<=m;i++)
			sum += p[i][0]*q[i];
		System.out.println("背包的最大价值为:"+sum);
	}
public  static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	System.out.println("请输入物品种类数:");
	int n = in.nextInt();
	System.out.println("请输入背包容量:");
	float M = in.nextFloat();
	float [][] wv = new float[n+1][n+1];//二维数组的第0行存储物品重量,第0列存储物品价值
	float [] x = new float[n+1];
	System.out.println("请输入物品价值:");
	for(int i = 1;i <= n;i++) {
		wv[i][0] = in.nextFloat();
		}
	System.out.println("请输入物品重量:");
	for(int i = 1;i <= n;i++) {
		wv[0][i] = in.nextFloat();
		}
	Knapsack( n,  M, wv, x);
	}
}

示例输入输出:
在这里插入图片描述
学习中,欢迎交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值