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;
}
}
}
}
}
用贪心算法背包问题,Java实现
原文作者:排序算法
原文地址: https://blog.csdn.net/shuoyuechenxing/article/details/70551940
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/shuoyuechenxing/article/details/70551940
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。