用贪心算法解背包问题Java实现
来源:互联网 发布:js获取json长度 编辑:程序博客网 时间:2024/05/21 17:16
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;
}
}
}
}
}
/*
* 用贪心算法解背包问题
*/
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;
}
}
}
}
}
1 0
- 用贪心算法背包问题,Java实现
- 用贪心算法解背包问题Java实现
- JAVA贪心算法实现背包问题
- 用贪心算法实现的背包问题(java语言)
- 用贪心算法实现的背包问题
- 贪心算法运用于背包问题(C++实现)
- 背包问题之贪心算法实现
- 【算法】贪心策略实现部分背包问题
- 贪心算法_01背包问题_Java实现
- Java描述贪心算法解决背包问题
- [贪心算法]java解决背包问题
- 贪心算法 - 背包问题
- 贪心算法----背包问题
- 【贪心算法】:背包问题
- 贪心算法-背包问题
- 贪心算法 背包问题
- 贪心算法-背包问题
- 【贪心算法】背包问题
- 从面向过程看面向对象
- 云计算的三种服务模式:IaaS,PaaS和SaaS
- Spring AOP 简述
- Linux 网络配置文件Interfaces模板
- 前端基础摘要
- 用贪心算法解背包问题Java实现
- Android API配置查阅(本地+在线)
- jetbrains idea/webstorm等(注册,激活,破解,码,一起支持正版,最新可用)(2017.3.16更新)
- Sublime text 3 [Decode error
- android基础图像处理
- 我的Android NDK之旅(二),使用ndk-build构建Jni
- Android手势密码探索
- Android 支持 Java8
- 区间覆盖问题