Code:
- package algorithm;
- /**
- * 利用贪心算法,对背包问题的java实现
- */
- public class Knapsack {
- private float m ; //背包容量
- private float[] v ; //三个物品的价值
- private float[] w ; //三个物品的质量
- private float[] x ; //往背包装东西的比例
- private int n ; //物品个数
- double[] p_w_v ; //每个物品的单位重量价值
- public Knapsack(){
- this.m = 50.0f ; //背包容量为50
- this.v = new float[]{60.0f,120.0f,100.0f} ; //三个物品的价值分别为60,120,100
- this.w = new float[]{10.0f,30.0f,20.0f} ; //三个物品的质量分别是10,30,20
- this.x = new float[3] ; //往背包装东西的比例
- this.n = 3 ; //三个物品
- this.p_w_v = new double[n] ; //每个物品的单位重量价值
- }
- //对物品的单位重量价值进行排序
- public void sort(int n , float[] v ,float[] w)throws Exception{
- for (int i = 0 ; i < n ; i++){
- p_w_v[i] = v[i] / w[i] ;
- }
- print (p_w_v);
- System.out.println ("");
- insertSort(p_w_v,w,v) ;
- print (p_w_v);
- }
- public void print (double a[]){//打印输出数组
- int len = a.length;
- for (int i = 0; i < len; i++){
- System.out.print(a[i] + " ");
- }
- }
- public void print (String str){//打印输出数组
- System.out.print(str + "/n");
- }
- public void insertSort(double[] a , float[] b , float[] c){//排序静态函数,实现排序功能
- int len = a.length;//获得数组长度
- double temp;//临时变量,用于交换值
- float w_temp ;
- float v_temp ;
- for (int i = 0; i < len-1; i++){ //通过循环实现主要算法
- for (int j = 0; j < len-1-i; j++){
- if (a[j+1] > a[j]){ //如果后一下值比前一个值大,则交换两个值的大小,
- temp = a[j+1]; //很显然是从大到小排序
- w_temp = w[j+1];
- v_temp = v[j+1];
- a[j+1] = a[j];
- w[j+1] = w[j];
- v[j+1] = v[j];
- w[j] = w_temp;
- v[j] = v_temp;
- }
- }
- }
- }
- //贪心算法核心思想
- public void knapsack()throws Exception{
- sort (n , v , w) ;
- int i ;
- for (i = 0 ; i < n ; i++){
- x[i] = 0 ;
- }
- float c = m ;
- for (i = 0 ; i < n ; i++){
- if (w[i] > c){
- break ;
- }
- x[i] = 1 ;
- c -= w[i] ;
- }
- if (i < n){
- x[i] = c / w[i] ;
- }
- print ("/n物品一可以装入的比例: " + x[0]);
- print ("物品二可以装入的比例: " + x[1]);
- print ("物品三可以装入的比例: " + x[2]);
- print ("可以装入的最大价值为: " + (x[0]*v[0] + x[1]*v[1] + x[2]*v[2]));
- print ("可以装入的最大重量为" + (x[0]*w[0] + x[1]*w[1] + x[2]*w[2]));
- }
- public static void main (String[] args)throws Exception{
- Knapsack ksp = new Knapsack();
- ksp.knapsack();
- }
- }