背包问题-贪心法-java实现

12 篇文章 1 订阅

完全背包问题
一个旅行者有一个最多能用m公斤的背包,现在有n种物品,每件的重量分别是W1,W2,...,Wn,
每件的价值分别为C1,C2,...,Cn.若的每种物品的件数足够多.
求旅行者能获得的最大总价值。

 

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。

 

 

贪心算法的基本思路

1.建立数学模型来描述问题。  2.把求解的问题分成若干个子问题。  3.对每一子问题求解,得到子问题的局部最优解。  4.把子问题的解局部最优解合成原来解问题的一个解。  实现该算法的过程:  从问题的某一初始解出发;  while 能朝给定总目标前进一步 do  求出可行解的一个解元素;  由所有解元素组合成问题的一个可行解。

 

  下面是一个可以试用贪心算法解的题目,贪心解的确不错,可惜不是最优解。

 

 

[java]  view plain copy
  1. /** 
  2.  * 背包贪心法 
  3.  *  
  4.  * @author *** 
  5.  *  
  6.  */  
  7. public class Greedy {  
  8.     public static void main(String[] args) {  
  9.         Scanner in = new Scanner(System.in);  
  10.         System.out.println("Please enter the number of objects(请输入物品的数量:):");  
  11.         int n = in.nextInt();  
  12.         int[] w = new int[n]; // 物品重量数组  
  13.         int[] v = new int[n]; // 物品价钱数组  
  14.         System.out  
  15.                 .println("Now, please enter the weight of these objects(现在请输入这些物品的重量:)");  
  16.         for (int i = 0; i < n; i++) {  
  17.             w[i] = in.nextInt();  
  18.         }  
  19.         System.out  
  20.                 .println("Now, please enter the value of these objects(现在请输入这些物品的价值:)");  
  21.         for (int i = 0; i < n; i++) {  
  22.             v[i] = in.nextInt();  
  23.         }  
  24.         System.out  
  25.                 .println("Now, please enter the capacity of the pack(现在请输入背包的容量:)");  
  26.         int c = in.nextInt();  
  27.         /** 
  28.          * 按单位重量价值r[i] = v[i] / w[i]降序排列 
  29.          *  
  30.          * ps:排序用到了选择排序,详情请查看选择排序 
  31.          */  
  32.         double startTime = System.currentTimeMillis();  
  33.         double[] r = new double[n];  
  34.         int[] index = new int[n];  
  35.         for (int i = 0; i < n; i++) {  
  36.             r[i] = (double) v[i] / (double) w[i];  
  37.             index[i] = i;  
  38.         }  
  39.         double temp = 0;  
  40.         for (int i = 0; i < n - 1; i++) {  
  41.             for (int j = i + 1; j < n; j++) {  
  42.                 if (r[i] < r[j]) {  
  43.                     temp = r[i];  
  44.                     r[i] = r[j];  
  45.                     r[j] = temp;  
  46.                     int x = index[i];  
  47.                     index[i] = index[j];  
  48.                     index[j] = x;  
  49.                 }  
  50.             }  
  51.         }  
  52.         /** 
  53.          * 排序后的重量和价值分别存到w1[]和v1[]中 
  54.          */  
  55.         int[] w1 = new int[n];  
  56.         int[] v1 = new int[n];  
  57.         for (int i = 0; i < n; i++) {  
  58.             w1[i] = w[index[i]];  
  59.             v1[i] = v[index[i]];  
  60.         }  
  61.         /** 
  62.          * 初始化解向量x[n] 
  63.          */  
  64.         int[] x = new int[n];  
  65.         for (int i = 0; i < n; i++) {  
  66.             x[i] = 0;  
  67.         }  
  68.         /** 
  69.          * 求解并打印解向量 
  70.          */  
  71.         for (int i = 0; i < n; i++) {  
  72.             if (w1[i] < c) {  
  73.                 x[i] = 1;  
  74.                 c = c - w1[i];  
  75.             }  
  76.         }  
  77.         System.out  
  78.                 .println("The solution vector is(解向量是:)" + Arrays.toString(x));  
  79.         /** 
  80.          * 根据解向量求出背包中存放物品的最大价值并打印 
  81.          */  
  82.         int maxValue = 0;  
  83.         for (int i = 0; i < n; i++) {  
  84.             if (x[i] == 1)  
  85.                 maxValue += v1[i];  
  86.         }  
  87.         double endTime = System.currentTimeMillis();  
  88.         System.out  
  89.                 .println("Now, the largest values of objects in the pack is(背包中物品的最大价值为:)"  
  90.                         + maxValue);  
  91.         System.out.println("Basic Statements take(基本语句用时)"  
  92.                 + (endTime - startTime) + " milliseconds!");  
  93.     }  
  94. }  

 

转载于:http://blog.csdn.net/double501/article/details/5895201

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值