用贪心算法解背包问题Java实现

package n18_背包问题贪心算法;

/*

 * 用贪心算法解背包问题

 */

public class Main {

public static void main(String[] args) {

// 单位重量价值分别为:10 5 7 6 3 8 90 100

double w[] = { 0, 50, 80, 30, 40, 20, 60, 10 ,1};//物体的重量

double v[] = { 0, 500, 400, 210, 240, 60, 480, 900,100 };//物体的价值

double M = 170;// 背包所能容纳的重量

int n = w.length – 1;// 物体的个数

double[] x = new double[n + 1];// 每个物体装进的比例,大于等于0并且小于等于1

f(w, v, M, n, x);//调用贪心算法函数

System.out.println(“排序后的物体的重量:”);

for(int i=1;i<=n;i++){

System.out.print(w[i]+”\t”);

}

System.out.println();

System.out.println(“排序后的物体的价值:”);

for(int i=1;i<=n;i++){

System.out.print(v[i]+”\t”);

}

double[]t=new double[n+1];//定义一个数组表示单位重量物体的价值

for(int i=1;i<=n;i++){

t[i]=v[i]/w[i];

}

//用冒泡排序对double[]t进行排序(大的在前)

for(int i=1;i<=n;i++){

for(int j=1;j<=n-i;j++){

if(t[j]<t[j+1]){

double temp=t[j];

t[j]=t[j+1];

t[j+1]=temp;

}

}

}

System.out.println();

System.out.println(“排好序后的单位物体的价值: “);

for(int i=1;i<=n;i++){

System.out.print(t[i]+”\t”);

}

double maxValueSum=0;
//用来存放背包能装下的物体的最大价值总和

for(int i=1;i<x.length;i++){

maxValueSum+=x[i]*v[i];

}

System.out.println();

System.out.println(“排序后每个物体装进背包的比例:”);

for(int i=1;i<=n;i++){

System.out.print(x[i]+”\t”);

}

System.out.println();

System.out.println(“背包能装下的物体的最大价值总和为: “+maxValueSum);

}

/**

* @param w
物体的重量

* @param v
物体的价值

* @param M
背包的容量

* @param n
物体的个数

* @param x
每个物体装进背包的比例,取值0<=x[i]<=1,(1<=i<=n)

*/

private static void f(double[] w, double[] v, double M, int n, double[] x) {

sort(w, v, n);// 首先按照物体的单位重量的价值进行排序,单位重量价值大的排在前面

double c = M;
//背包剩余的容量,刚开始时还没用装东西,为M

int i;//表示第几五物体

for (i = 1; i <= n; i++) {

if (w[i] <= c){//如果背包剩余的容量大于等于第i个物体的重量

x[i] = 1;
//把第i个物体整个装进背包

c -= w[i];
//背包的剩余容量减少了第i个物体的重量

}else {

break;
//退出循环

}

}

if (i <= n){//判断是否第n个物体整个装进去背包里了,如果i<=n表示否定

x[i] = c / w[i];

}

}

/*

* 可以按冒泡排序来写,先计算W中每个物体单位价值存成一个数组,然后冒泡排序,

* 若有元素交换,对应W中相同标号的元素也交换就可以了

*/

private static void sort(double[] w, double[] v, int n) {

double []t=new double[n+1];

for(int i=1;i<=n;i++){

t[i]=v[i]/w[i];

}

for(int i=1;i<=n;i++){

for(int j=1;j<=n-i;j++){

if(t[j]<t[j+1]){

double temp=t[j];

t[j]=t[j+1];

t[j+1]=temp;

double temp2=w[j];

w[j]=w[j+1];

w[j+1]=temp2;

double temp3=v[j];

v[j]=v[j+1];

v[j+1]=temp3;

}

}

}

}

}

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/shuoyuechenxing/article/details/70502467
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞