/**< 1th exmaple: */
/** \brief
 *  一个商人带着一个能装m千克的背包去乡下收购货物,
 * \ 现有n种货源,且第i种货物有wi千克,可获利pi元,
 * \ 如何收购商品,才能使利润最大,注意此时物品可以拆零。
 * \return
 * data:
        5 10
        4 5
        2 6
        3 4
        8 15
        5 18
 */

/**< 贪婪算法解决,

收获:对于一个数组内的值,如果要从小到大或者重大到小进行选择,可以开一个choose数组进行存储下标。但这个程序用了O(n^2)的时间复杂度,等好的做法应是开一个结构来存储下标和值,然后进行排序,时间复杂度O(n*lgn),或许还有好的算法吧,这是我目前所知道的较好的一个算法。

/**< 1th exmaple: */
/** \brief*  一个商人带着一个能装m千克的背包去乡下收购货物,* \ 现有n种货源,且第i种货物有wi千克,可获利pi元,* \ 如何收购商品,才能使利润最大,注意此时物品可以拆零。* \return* data:5 104 52 63 48 155 18*//**< 贪婪算法解决 */
#include <iostream>using namespace std;
struct infor
{double weight,value,price;
};
int main()
{int sum_cap,sum_size;cout << "输入总的物品数量及背包的容量:\n";cin >> sum_size >> sum_cap ;cout << "输入" << sum_size << "件物品的重量及价值:\n";infor matr[sum_size+1];int sum_weight=0;for(int i=1;i<=sum_size;++i){cin >> matr[i].weight >> matr[i].value;matr[i].price=matr[i].value/matr[i].weight;sum_weight+=matr[i].weight;}if(sum_weight<=sum_cap)cout << "choose total\n";else{int choose[sum_size+1]; //< choose 为索引表,得到所选物品顺序的同时,又不改变物品原有顺序for(int i=1;i<=sum_size;++i){int maxi=1;for(int j=2;j<=sum_size;++j)if(matr[j].price>matr[maxi].price)maxi=j;matr[maxi].price=0; //< 得到最大价值的物体标号后,要把它置为0,防止下次重复选择choose[i]=maxi;} //想了一下,choose数组的处理是否也可以称之为数据的离散化,emm,应该是吧!int k;double sum=0,sum_value=0; //注意,sum及sum_value的数据类型取double是应该的for( k=1;k<=sum_size&&sum<=sum_cap;++k){sum+=matr[choose[k]].weight;sum_value+=matr[choose[k]].value;}if(sum!=sum_cap)    //有可能sum比总容量还要多,则要去掉最后一件商品的一定数量{sum_value-=matr[choose[k-1]].value/matr[choose[k-1]].weight*(sum-sum_cap);matr[choose[k-1]].weight-=(sum-sum_cap);}for(int h=1;h<k;++h)cout << choose[h] << "th: " << "item choose weight is  " << matr[choose[h]].weight << endl;cout << "sum weights are: " << sum_cap << endl;cout << "sum values is: " <<  sum_value << endl;}cout << "Hello world!" << endl;return 0;
}

/**< 2th exmaple: */
/** \brief
 *  一个商人带着一个能装m千克的背包去乡下收购货物,
 * \ 现有n种货源,且第i种货物有wi千克,可获利pi元,
 * \ 如何收购商品,才能使利润最大,注意此时物品不可以拆零。
 * \ data : 5 8
            3 5 1 2 2
            4 5 2 1 3
 *
 * \  深度优先搜索算法解决 :
      void DFS(int index,int sumweight,int sumvalue):
      表示选择第index件物品,已经选择的物品的总重量为sumweight,
      已经选择的物品的总价值为sumvalue
*/

/**< 2th exmaple: */
/** \brief*  一个商人带着一个能装m千克的背包去乡下收购货物,* \ 现有n种货源,且第i种货物有wi千克,可获利pi元,* \ 如何收购商品,才能使利润最大,注意此时物品不可以拆零。* \ data : 5 83 5 1 2 24 5 2 1 3** \  深度优先搜索算法解决 :void DFS(int index,int sumweight,int sumvalue):表示选择第index件物品,已经选择的物品的总重量为sumweight,已经选择的物品的总价值为sumvalue
*/#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
void DFS(int index,int sumweight,int sumvalue);
const int maxn=101;
int n,v,w[maxn],c[maxn],maxvalue=-1;
vector<int> temp,ans;  //ans为最终的最优方案的物品下标,temp为局部最优方案的物品下标
int main()
{cout << "输入物品的数量,以及背包的容量:\n";cin >> n >> v;cout << "输入这些物品的重量:\n";for(int i=0;i<n;++i)cin >> w[i];cout << "输入这些物品的价值:\n";for(int i=0;i<n;++i)cin >> c[i];DFS(0,0,0);cout << "选择的物品标号为:\n";for(auto s:ans)cout << "第" << s+1 << "件" << endl;cout << "总价值为:" << maxvalue << endl;return 0;
}void DFS(int index,int sumweight,int sumvalue)//把选择的物品下标也算出来了
{if(index==n||sumweight>v)    //递归边界return;temp.push_back(index);if(sumweight+w[index]<=v){if(sumvalue+c[index]>maxvalue){maxvalue=sumvalue+c[index];ans=temp;}DFS(index+1,sumweight+w[index],sumvalue+c[index]);//递归式}temp.pop_back();DFS(index+1,sumweight,sumvalue);
}

与利润有关的背包问题(贪心算法,深度优先搜索)相关推荐

  1. 背包问题 贪心算法 java_JS基于贪心算法解决背包问题

    前面我们分享了关于js使用贪心算法解决找零问题,本文我们接着为大家介绍JS基于贪心算法解决背包问题. 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做 ...

  2. 背包问题贪心算法求解

    题目 有一个背包,背包容量是M=150.有7个物品,物品可以分割成任意大小. 要求尽可能让装入背包中的物品总价值最大,但不能超过总容量. 思路 具有最优子结构性质和贪心选择性质.只要是所有物品的总重量 ...

  3. 完全背包问题贪心算法c语言,数据结构与算法学习之路:背包问题的贪心算法和动态规划算法...

    一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算 ...

  4. 背包问题 贪心算法 java_JS基于贪心算法解决背包问题示例

    本文实例讲述了JS基于贪心算法解决背包问题.分享给大家供大家参考,具体如下: 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局 ...

  5. c语言背包问题贪心算法,C/C++语言算法篇(一):贪心算法

    贪心算法 正所谓人人都有贪心,C语言算法上的贪心可不是实际意义上的贪心,C语言结构上的贪 心可以说满足两个条件:贪心选择性质和最优子结构性质.满足这两个条件的话就可以尝试用贪心算法解决问题. 贪心选择 ...

  6. (算法)深度优先搜索

    深度优先搜索 概述 [一条路走到底,不撞南墙不回头] [撞南墙]有两种情况:①遇到了边界条件,②遇到了已经走过的路 深度优先的另一种结束条件,就是找到了目标出口 深度优先遍历的本质就是穷举 常见的深度 ...

  7. 啊哈 , 算法 !--深度优先搜索( C语言版 )

    深度优先搜索 : 理解的关键在于解决"当下该如何做".至于"下一步该如何做"则与"当下该如何做"是一样的 问题 : 求出123的全排列 12 ...

  8. 基础算法·深度优先搜索

    祝食用愉快XD 题目链接 (是一道胡乱出的题) U56815 来走迷宫鸭! 解题思路 深度优先搜索,如果能不碰墙地到达右下角的出口,就把旗子立起来表示找到了出口. 什么?你没听过深度优先搜索 没事,且 ...

  9. java编程贪心算法背包问题,贪心算法----部分背包问题(java实现)

    部分背包问题 给定 n 种物品和一个背包.物品 i 的重量是 Wi,其价值为 Vi,背包的容量为 C.在选择物品 i 装入背包时,可以选择物品 i 的一部分,1<= i <=n.问应如何选 ...

  10. 贪心算法 0-1背包c语言,贪心算法0-1背包问题(算法实验代码).pdf

    . 实验三. 0-1 背包问题(贪心算法) 实验代码: #include int max(int a,int b) { if(a>b) return a; else return b; } vo ...

最新文章

  1. 朴素、Select、Poll和Epoll网络编程模型实现和分析——模型比较
  2. 重磅图书——PHP MySQL开发新圣经
  3. 在 SQL Server 2K 中实现 大小写敏感的查询条件(WHERE ...),类似 Access(VB) 的 StrComp 函数...
  4. 微博 用户画像_分析用户画像?从微博数据采集开始!
  5. diou diou_nms代码分享
  6. python乘法口诀表-用python打印99乘法口诀表
  7. 在路上---一个平凡人的2015年总结及2016年展望
  8. SpiderData 2019年2月22日 DApp数据排行榜
  9. jq之mouseenter
  10. python生成器函数(generator),python3学习笔记:生成器generator
  11. 利用python进行tf-idf算法绘制词云图_利用python实现通过TF-IDF和BM25提取文章关键词...
  12. C#在foreach中重用变量是否有原因?
  13. Linux文件系统Ext2,Ext3,Ext4性能大比拼
  14. php二维码与电子名片
  15. 哪个不是计算机使用的汉子编码,下列不是计算机上使用的汉字编码的是( )。 A.字型码 B.外码 C.内码 D.条形码...
  16. 求职简历-机器学习工程师V2
  17. 【CST】贴片天线阵列设计
  18. dnSpy反编译工具调试netcore项目
  19. SDN概述:简介、工具、环境部署
  20. 服务器配置与软件安装合集

热门文章

  1. 《精益数据分析》第四章:以数据为导向与通过数据获取信息
  2. 计算机数值模拟区域模拟,古地温史计算机数值模拟
  3. 【solr】——全文检索实现原理
  4. Flink流计算可视化平台
  5. Java版砸蘑菇游戏
  6. 残差神经网络 ResNet
  7. [转帖]华为不想做下一个英特尔 但计算野心尽露
  8. JDK8的安装及win10配置JDK8的环境变量
  9. 汽车理论动力性仿真-Simulink
  10. java项目管理系统禅道下载,禅道项目管理软件