贪心算法求解背包问题

£神魔★判官ぃ 2023-10-14 11:39 181阅读 0赞

贪心算法,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 。

解题的一般步骤是:
1.建立数学模型来描述问题;
2.把求解的问题分成若干个子问题;
3.对每一子问题求解,得到子问题的局部最优解;
4.把子问题的局部最优解合成原来问题的一个解。

在这里我们用贪心法来解决可切割物品的背包问题,首先选择贪心属性,比较所有物品的单价;其次,按照物品单价将所有物品从大到小进行排序;最后,优先把单价高的物品装进背包。将单价第一高的物品尽可能全部装入背包,如果背包容量还有剩余,则继续将单价第二高的物品尽可能装进背包…以此类推,就可以求出背包问题的最优解。

在这个问题中,可以使用结构体来储存物品及其价格与单价的信息,在这里使用选择排序按照单价对结构体成员进行排序。

  1. #include<stdlib.h>
  2. #include<time.h>
  3. #include<stdio.h>
  4. const int N=10;
  5. double value=0;
  6. struct goods{
  7. int No;//编号
  8. int w;//重量
  9. int v;//价值
  10. double avg;//单位重量的价值
  11. };
  12. void selectsort(goods g[]){
  13. //选择排序
  14. for(int i=0;i<N;i++)
  15. for(int j=i;j<N;j++)
  16. if(g[i].avg<g[j].avg){
  17. goods x;
  18. x=g[i];
  19. g[i]=g[j];
  20. g[j]=x;
  21. }
  22. }
  23. double greedy_tui(goods g[],int c)
  24. {
  25. double value=0;
  26. for(int i=0;i<N;i++){
  27. //对排好序的物品按顺序进行贪心
  28. if(c<g[i].w){
  29. if(c>0){
  30. value=value+c*g[i].avg;
  31. g[i].w=g[i].w-c;
  32. c=0;
  33. }else break;
  34. }else{
  35. value=value+g[i].v;
  36. c=c-g[i].w;
  37. }
  38. //Found!!!!!
  39. //先装哪个?如何判断是否满了?
  40. //什么时候需要分割物品?如何记录最大价值?
  41. }
  42. return value;
  43. }
  44. int main()
  45. {
  46. //srand((unsigned)time(NULL));
  47. int c=rand()%50;//初始化背包容量
  48. printf("背包最大承重:%d公斤\n",c);
  49. goods g[N];
  50. for(int i=0;i<N;i++)//初始化物品参数
  51. {
  52. g[i].No=i;
  53. g[i].w=rand()%10+1;
  54. g[i].v=rand()%10+1;
  55. g[i].avg=g[i].v;
  56. g[i].avg=g[i].avg/g[i].w;
  57. printf("物品%d重%d公斤,价值%d元\n",g[i].No,g[i].w,g[i].v);
  58. }
  59. selectsort(g);
  60. printf("排序后:\n");
  61. for(int i=0;i<N;i++) printf("物品%d重%d公斤,价值%d元\n",g[i].No,g[i].w,g[i].v);
  62. printf("递推能装入背包的最大价值为%f元\n",greedy_tui(g,c));
  63. return 0;
  64. }

发表评论

表情:
评论列表 (有 0 条评论,181人围观)

还没有评论,来说两句吧...

相关阅读

    相关 贪心算法求解背包问题

    贪心算法,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 。 解题的一般步骤是: 1.建立数学模型

    相关 部分背包问题贪心算法

    题目描述:有一个背包,容量为 c,同时有若干物品,价值各不相同,重量也各不相同。我们需要选择一部分物品装入背包,要保证在不超过背包容量的前提下是的装入背包中的物品的总价值最大。

    相关 Java描述贪心算法解决背包问题

    思路: 首先将物品根据性价比排好序在一个集合里,性价比=价格/重量... 然后根据性价比从大到小依次依次放入背包,如果没办法放入这个物品的全部,就放入一部分,如果可以放入全量

    相关 贪心算法背包问题)NYOJ-106

    贪心算法 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法不是对所有问