贪心算法(背包问题)

包可以承受15kg重量,有五个物体质量依次为12, 2 ,1, 4, 1价格为4,2,2,10,1,求包所能装的最大价值是

问题分析:

1.先求出价值=格/重量,并用数组保存;

2.根据价值,对数组内元素进行从大到小排序

3.从价值高的开始装,此时,背包问题分为可切割背包问题和不可切割背包问题

  1. //可切割背包问题
  2. #include <iostream>
  3. using namespace std;
  4. class a
  5. {
  6. public:
  7. int p,w;
  8. double v;
  9. };
  10. int main()
  11. {
  12. a f[5],t;
  13. int i,j,s,m,n,sum;
  14. cin>>n;
  15. for(i=0;i<5;i++)
  16. {
  17. cin>>f[i].p>>f[i].w;
  18. f[i].v=(double)f[i].p/(double)f[i].w;
  19. }
  20. for(i=0;i<5;i++)
  21. for(j=0;j<5;j++)
  22. {
  23. if(f[i].v>f[j].v)
  24. {
  25. t=f[i];
  26. f[i]=f[j];
  27. f[j]=t;
  28. }
  29. }
  30. s=0;
  31. m=0;
  32. sum=0;
  33. for(i=0;i<5;i++)
  34. {
  35. s=s+f[i].w;
  36. if(n>s)
  37. {
  38. m=n-s;
  39. sum=sum+f[i].p;
  40. }
  41. else
  42. sum=sum+f[i].v*m;
  43. }
  44. cout<<sum<<endl;
  45. return 0;
  46. }
 
  1. 不可分割背包问题
  2. #include <iostream>
  3. using namespace std;
  4. class a
  5. {
  6. public:
  7. int p,w;
  8. double v;
  9. };
  10. int main()
  11. {
  12. a f[5],t;
  13. int i,j,s,m,n;
  14. cin>>n;
  15. for(i=0;i<5;i++)
  16. {
  17. cin>>f[i].p>>f[i].w;
  18. f[i].v=(double)f[i].p/(double)f[i].w;
  19. }
  20. for(i=0;i<5;i++)
  21. for(j=0;j<5;j++)
  22. {
  23. if(f[i].v>f[j].v)
  24. {
  25. t=f[i];
  26. f[i]=f[j];
  27. f[j]=t;
  28. }
  29. }
  30. s=0;
  31. m=0;
  32. for(i=0;i<5;i++)
  33. {
  34. s=s+f[i].w;
  35. if(s>n)break;
  36. m=m+f[i].p;
  37. }
  38. cout<<m<<endl;
  39. return 0;
  40. }

贪心算法(背包问题)

时间: 2024-10-10 18:06:38

贪心算法(背包问题)的相关文章

十:贪心算法-背包问题

问题:贪心算法-背包问题题目描述有一背包空间为m,现有n个物体,他们的重量为w[i],价值为v[i].应该如何选择装入背包的物品,使其装入背包的物品总价值最大?(因为采用贪心算法,最终的结果不一定最优,但应该是接近于最优.提示:本题所选的方法为每次选取单位价值最高的物品)输入第一行分别为背包的空间m和物品数量n接下来有n行每行分别为物体的w[i]和价值v[i]输出一个整数样例输入30 328 3012 2014 20样例输出 40 1 #include<stdio.h> 2 int k=0;

贪心算法之背包问题

贪婪算法的基本思想:通过一系列步骤来构造问题的解,每一步都是对已构造的部分解的一个扩展,直到获得问题的完整解. 贪婪算法中,每一步“贪婪地” 选择最好的部分解,但不顾及这样选择对整体的影响(局部最优),因此得到的全局解不一定最好的解,但对许多问题它能产生整体最优解. 具体算法描述: public static void Greedy()        {            float cu = c;            int temp = 0;            int i = 0;

数据结构之贪心算法(背包问题的思考)-(十)

贪心策略.关于贪心算法的思考,思考过程都放在代码中了. package com.lip.datastructure; /** *贪心算法:装箱问题的思考 * @author Lip *装箱问题可以是时间调问题的延伸,当一个箱子没有容积限制,那么就是时间调度问题 *在时间调度问题中:存在两个可以讨论的问题.1.平均最短时间 2.总的最短时间 *这两个问题都和装箱问题中问题如此类似. */ /* * 上面是我理解的装箱问题,本来是想说背包问题的 * 背包问题的描述:有N件物品和一个容量为V的背包.第

[C++] 贪心算法之活动安排、背包问题

一.贪心算法的基本思想 在求解过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解. 从贪心算法的定义可以看出,贪心算法不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解.如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一. 二.贪心算法的基本要素 (1)最优子结构性质 (2)贪心选择性质(局部最优选择) 三.贪心算法实例 1.活动安排 设有n个活

背包问题:0/1背包问题 普通背包问题(贪心算法只适用于普通背包问题)

//sj和vj分别为第j项物品的体积和价值,W是总体积限制. //V[i,j]表示从前i项{u1,u2,…,un}中取出来的装入体积为j的背包的物品的最大价值. 第一种:0/1背包问题 最大化 ,受限于  1)若i=0或j=0,  V[i,j] = 0 2)若j<si, V[i,j] = V[i-1,j] 3)若i>0且j>=si, V[i,j] = Max{V[i-1,j],V[i-1,j-si]+vi} 第二种:背包问题:在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部

贪心算法练习题:部分背包问题

/*----------------------------------------------------- 有n个物体,第i个物体的重量是wi,价值为vi, 选若干个物体,使得在总重量不超过c的情况下让总价值尽量高. 这里每个物体都可以只取走一部分,价值和重量按比例计算. 输入: 第一行输入两个整数表示n和c. 第2到第n+1行每行两个整数分别表示wi和vi. 输出: 第一行输出所选物品的总价值v和总重量w以及所选物品的种类数num.两两之间用空格分隔. 第二行到第n+1行按照输入物品的顺序

背包问题:动态规划和贪心算法

1. 动态规划 以下关于动态规划的文字描述来源 动态规划之背包问题(一) 作者:Hawstein 出处:http://hawstein.com/posts/dp-knapsack.html 一切都要从一则故事说起. 话说有一哥们去森林里玩发现了一堆宝石,他数了数,一共有n个. 但他身上能装宝石的就只有一个背包,背包的容量为C.这哥们把n个宝石排成一排并编上号: 0,1,2,-,n-1.第i个宝石对应的体积和价值分别为V[i]和W[i] .排好后这哥们开始思考: 背包总共也就只能装下体积为C的东西

部分背包问题的贪心算法正确性证明

一,部分背包问题介绍 首先介绍下0-1背包问题.假设一共有N件物品,第 i 件物品的价值为 Vi ,重量为Wi,一个小偷有一个最多只能装下重量为W的背包,他希望带走的物品越有价值越好,请问:他应该选择哪些物品? 0-1背包问题的特点是:对于某件(更适合的说法是:某类)物品,要么被带走(选择了它),要么不被带走(没有选择它),不存在只带走一部分的情况. 而部分背包问题则是:可以带走一部分.即,部分背包问题可带走的物品 是可以 无限细分的.(连续与离散的区别) 可以把0-1背包问题中的物品想象的一个

背包问题的贪心算法

1. 贪心算法的基本原理: 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择.当然,希望贪心算法得到的最终结果也是整体最优的.虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解.如单源最短路经问题,最小生成树问题等.在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似.? 贪心算法求解的问题一般具有两个重要性质:贪心选择性质和最优子结构性质. (1)所谓贪心选择性质是指所求问题的