贪心算法背包问题java代码

/*贪心算法求得的是局部最优解,而不是整体最优解

*归纳起来就是先求出每个物品的平均价值(也就是价值/重量);

*然后再将得出来的每个物品的平均价值降序排序,并记录各自在数组中的位置(即下标)

*将排序后的物品重量和价值分别用新数组来存储

*根据背包容量来判断,一件一件装入背包,直到装满为止,在这个过程中通过解向量判断是否已经装满

*最后根据解向量算出装入物品的价值

*/

package test;

import java.util.Arrays;

import java.util.Scanner;

//

public class Greedy {

public static void main(String[] args){

Scanner in = new Scanner(System.in);

System.out.println("Please enter the number of objects(请输入物品的数量:)");

int n = in.nextInt();

int[] w = new int[n]; //物品重量数组weight

int[] v = new int[n]; //物品价值数组value

System.out.println("Now please enter the weight of the objects(现在请输入这些物品的重量:)");

for(int i=0;i

w[i] = in.nextInt();

}

System.out.println("Now please enter the value of the ojects(现在请输入这些物品的价值:)");

for(int j=0;j

v[j] = in.nextInt();

}

System.out.println("Now please enter the capacity of the pack(请输入背包的容积:)");

int c = in.nextInt();

double startTime = System.currentTimeMillis();

int[] index = new int[n];

double[] r = new double[n]; //定义物品的质量价值

for(int k=0;k

r[k] = v[k]/w[k]; //获取物品的重量价值

index[k] = k;

}

//采用选择排序的方法来求解

double temp = 0;

int x = 0;

for(int i=0;i

for(int j=i+1;j

if(r[i]

temp = r[i];

r[i] = r[j];

r[j] = temp;

x = index[i];

index[i] = index[j];

index[j] = x;

}

}

}

//将排序后的重量和价值存放在新的数组中

int[] w1 = new int[n];

int[] v1 = new int[n];

for(int i=0;i

v1[i] = v[index[i]];

w1[i] = w[index[i]];

}

//初始化解向量

int[] x1 = new int[n];

for (int i = 0; i

x1[i] = 0;

}

/*

* 求解并打印向量

*/

for(int i=0;i

if(w1[i]

x1[i] = 1;

c = c-w1[i];

}

}

System.out.println("The solution vector is(解向量是:)"+Arrays.toString(x1));

/*

* 根据解向量求出最大价值并打印出来

*/

int maxValue=0;

for(int i=0;i

if(x1[i]==1){

maxValue = maxValue+v1[i];

}

}

System.out.println("Now,the max value of object in the pack is(背包可以容纳的最大价值是:)"+maxValue);

//算法结束时间

double endTime = System.currentTimeMillis();

System.out.println("The Statements takes the time is(算法执行所花费的时间为:)"+(endTi

me-startTime)+ " milliseconds!");

}

}

/*贪心算法求得的是局部最优解,而不是整体最优解

*归纳起来就是先求出每个物品的平均价值(也就是价值/重量);

*然后再将得出来的每个物品的平均价值降序排序,并记录各自在数组中的位置(即下标)

*将排序后的物品重量和价值分别用新数组来存储

*根据背包容量来判断,一件一件装入背包,直到装满为止,在这个过程中通过解向量判断是否已经装满

*最后根据解向量算出装入物品的价值

*/

package test;

import java.util.Arrays;

import java.util.Scanner;

//

public class Greedy {

public static void main(String[] args){

Scanner in = new Scanner(System.in);

System.out.println("Please enter the number of objects(请输入物品的数量:)");

int n = in.nextInt();

int[] w = new int[n]; //物品重量数组weight

int[] v = new int[n]; //物品价值数组value

System.out.println("Now please enter the weight of the objects(现在请输入这些物品的重量:)");

for(int i=0;i

w[i] = in.nextInt();

}

System.out.println("Now please enter the value of the ojects(现在请输入这些物品的价值:)");

for(int j=0;j

v[j] = in.nextInt();

}

System.out.println("Now please enter the capacity of the pack(请输入背包的容积:)");

int c = in.nextInt();

double startTime = System.currentTimeMillis();

int[] index = new int[n];

double[] r = new double[n]; //定义物品的质量价值

for(int k=0;k

r[k] = v[k]/w[k]; //获取物品的重量价值

index[k] = k;

}

//采用选择排序的方法来求解

double temp = 0;

int x = 0;

for(int i=0;i

for(int j=i+1;j

if(r[i]

temp = r[i];

r[i] = r[j];

r[j] = temp;

x = index[i];

index[i] = index[j];

index[j] = x;

}

}

}

//将排序后的重量和价值存放在新的数组中

int[] w1 = new int[n];

int[] v1 = new int[n];

for(int i=0;i

v1[i] = v[index[i]];

w1[i] = w[index[i]];

}

//初始化解向量

int[] x1 = new int[n];

for (int i = 0; i

x1[i] = 0;

}

/*

* 求解并打印向量

*/

for(int i=0;i

if(w1[i]

x1[i] = 1;

c = c-w1[i];

}

}

System.out.println("The solution vector is(解向量是:)"+Arrays.toString(x1));

/*

* 根据解向量求出最大价值并打印出来

*/

int maxValue=0;

for(int i=0;i

if(x1[i]==1){

maxValue = maxValue+v1[i];

}

}

System.out.println("Now,the max value of object in the pack is(背包可以容纳的最大价值是:)"+maxValue);

//算法结束时间

double endTime = System.currentTimeMillis();

System.out.println("The Statements takes the time is(算法执行所花费的时间为:)"+(endTi

me-startTime)+ " milliseconds!");

}

}


相关内容

  • 算法实验报告
  • 实验一快速排序 一问题描述 实现对数组的普通快速排序与随机快速排序 二实验要求 (1)实现上述两种排序方法 (2)统计算法运行时间 (3)分析性能差异,做出总结 三算法原理 (1)快速排序原理: 每次将数组最后一个元素作为基准,对待排数组进行分组,使基准元素左边的数据比基准数据要小,右边的数据比基准 ...

  • 算法设计期末总结
  • 第一部分:算法基础 1.算法五个特征: 零个或多个输入.至少一个输出.确定性.能行性.有穷性. 算法就是求解一类问题的任意一种特殊的方法. 联系:算法+数据结构=程序,算法是程序设计的核心,算法的好坏程度上决定了一个程序的效率.一区别:算法是解决问题的步骤,程序是算法的代码实现依靠程序来完成功能,程 ...

  • 第4章贪心算法(0-算法思想)
  • 第4章 贪心算法 1 学习要点  贪心算法的基本思想  贪心算法的基本要素 (1)最优子结构性质 (2)贪心选择性质 贪心算法与动态规划算法的差异 正确性的证明 范例学习贪心设计策略 (1)活动安排问题: (4)单源最短路径: (2)最优装载问题: (5)最小生成树: (3)哈夫曼编码: (6) ...

  • 20151112-JWJ-Algorithm-12-贪心算法
  • 湖南大学-算法设计与分析课程 Lecture 12-贪心算法 姜文君 [email protected] 办公室:信息科学与工程学院院楼326 2015-2016第一学期 回 顾 动态规划6案例, 矩阵连乘.最长公共子序列. 最大子段和可扩展. 凸多边形最优三角剖分. 多边形游戏更一般. 0-1背包为经 ...

  • 软件设计师考试心得
  • "软件设计师"听起来高大上,其实也也没什么含量,通过了也不见得你精通软件.但是有证件至少你曾今认真.努力过,因此不要因为名字的原因,妄自菲薄,没有自信,其实过他并不难. 软设学习,离不开2本书.一本是<软件设计师教程>,一本是<软件设计师历年真题>.软考涉 ...

  • 算法设计与分析_总结7
  • 第一章: 1. 算法定义:算法是若干指令的有穷序列,满足性质: (1)输入:有外部提供的量作为算法的输入. (2)输出:算法产生至少一个量作为输出. (3)确定性:组成算法的每条指令是清晰,无歧义的. (4)有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的. 2. 程序定义:程 ...

  • 2015年算法分析与设计期末考试试卷B卷
  • 西南交通大学2015-2016学年第(一) 学期考试试卷 课程代码3244152课程名称算法分析与设计考试时间120分钟 阅卷教师签字: 填空题(每空1分,共15分) 1. 2. 3. 4. 5. 程序是(1) 用某种程序设计语言的具体实现. 矩阵连乘问题的算法可由(2)设计实现. 从分治法的一般设 ...

  • 动态规划基本原理
  • 动态规划基本原理 近年来,涉及动态规划的各种竞赛题越来越多,每一年的NOI几乎都至少有一道题目需要用动态规划的方法来解决:而竞赛对选手运用动态规划知识的要求也越来越高,已经不再停留于简单的递推和建模上了. 要了解动态规划的概念,首先要知道什么是多阶段决策问题. 一.多阶段决策问题 如果一类活动过程可 ...

  • 模拟退火算法
  • 一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解. 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解.如图1所示:假设C ...