1.问题描述

背包问题是给定n个重量为{w1, w2,… ,wn}、价值为{v1, v2, … ,vn}的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,并且要能够装到背包中每次从物品集合中选择单位重量价值最大的物品,如果其重量小于背包容量,就可以把它装入,并将背包容量减去该物品的重量。

注意背包问题和0/1背包问题的区别,背包问题中,物品是可以部分装入背包的,0/1背包则不可以,要么装入,要么不装入。

2.算法思路

贪心法求解背包问题的贪心策略是:单位价值量。因此首先将物品按照单位价值量进行递减排序,从单位价值量最大的物品开始遍历,其重量小于当前背包容量则放入,相应增加背包价值、减少背包容量;直到一个物品重量大于当前背包容量,则将其按照比例部分放入。

3.参考代码

/*贪心法求解背包问题*/
/*背包问题是给定n个重量为{w1, w2, … ,wn}、价值为{v1, v2, … ,vn}的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,并且要能够装到背包中每次从物品集合中选择单位重量价值最大的物品,如果其重量小于背包容量,就可以把它装入,并将背包容量减去该物品的重量
*/
#include<iostream>
#include<algorithm>
using namespace std;
class Good
{private:int num;           //物品编号double weight;    //物品重量double value; //物品价值 public:Good(int n,double w, double v);   //构造函数Good();                           //默认构造函数void init(int n,double w,double v); //初始化int returnNum();double returnWeight();     //返回重量double returnValue();         //返回价值friend int cmp(Good good1,Good good2);            //按照单位价值量降序friend void KnapSack(Good *good,int num,int capacity);//贪心法求背包};
//构造函数
Good::Good(int n,double w, double v)
{num=n;weight=w;value=v;
}//默认构造函数
Good::Good()
{}//初始化
void Good::init(int n,double w,double v)
{num=n;weight=w;value=v;
}
//返回物品编号
int Good::returnNum()
{return num;
}
//返回重量
double Good::returnWeight()
{return weight;
}//返回价值
double Good::returnValue()
{return value;
}//按照单位价值量降序排序
int cmp(Good good1,Good good2)
{return good1.returnValue()/good1.returnWeight() > good2.returnWeight()/good2.returnValue();
}
//贪心法求解过程
void KnapSack(Good *good,int num,int capacity)
{double *process=new double[num];//存放问题的解int i;for(i=0;i<num;i++)process[i]=0;int maxValue=0;//背包最大价值for(i=0;good[i].returnWeight()<capacity;i++){process[i]=1;                         //物品i装入背包maxValue+=good[i].returnValue();capacity-=good[i].returnWeight();       //背包剩余容量cout<<"物品"<<good[i].returnNum()<<"完全装入背包"<<endl;cout<<"背包容量:"<<capacity<<",当前价值:"<<maxValue<<endl<<endl;}process[i]=((double)capacity)/good[i].returnWeight(); //部分装入maxValue+=process[i]*good[i].returnValue();cout<<"物品"<<good[i].returnNum()<<"部分装入背包"<<endl;cout<<"\n背包价值为:"<<maxValue;}
//主函数
int main()
{cout<<"欢迎来到贪心法求解背包问题,请输入背包容量"<<endl;int capacity;int good_num;int i;while(cin>>capacity){cout<<"请输入物品个数"<<endl;cin>>good_num;Good *good=new Good[good_num];//背包数组//初始化物品的重量和价值cout<<"请输入"<<good_num<<"个物品的重量和价值"<<endl;for(i=0;i<good_num;i++){double w,v;cin>>w;cin>>v;good[i].init(i+1,w,v);}//输出用户输入的信息cout<<"\n您输入的"<<good_num<<"个物品的信息"<<endl;cout<<"物品"<<"\t"<<"重量"<<"\t"<<"价值"<<"\t"<<endl;for(i=0;i<good_num;i++){cout<<good[i].returnNum()<<"\t"<<good[i].returnWeight()<<"\t"<<good[i].returnValue()<<"\t"<<endl;;}//单位价值降序排序sort(good, good+good_num, cmp);  cout<<"排序后"<<endl;cout<<"物品"<<"\t"<<"重量"<<"\t"<<"价值"<<"\t"<<endl;for(i=0;i<good_num;i++){cout<<good[i].returnNum()<<"\t"<<good[i].returnWeight()<<"\t"<<good[i].returnValue()<<"\t"<<endl;;}//计算KnapSack(good,good_num,capacity);cout<<"\n----------------------------------------------"<<endl;cout<<"欢迎来到贪心法求解背包问题,请输入背包容量"<<endl;}return 0;
}

4.参考结果

贪心法求解背包问题 C++相关推荐

  1. 贪心算法 背包问题 java_贪心算法求解背包问题

    一.贪心算法 1.贪心算法概念 贪婪算法(Greedy algorithm)是一种对某些求最优解问题的更简单.更迅速的设计技术.用贪婪法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测 ...

  2. 贪心法——部分背包问题

    贪心法--部分背包问题 部分背包问题.有nn个物体,第ii个物体的重量为wiw_i,价值为viv_i.在总重量不超过CC的情况下让总价值尽量高.每一个物体都可以只取走一部分,价值和重量按比例计算. 和 ...

  3. 贪心法求解硬币问题和乘船问题

    贪心算法基本要素: 贪心选择性质:问题的最优解可以通过贪心选择实现(也就是先实现局部最优解,然后整体最优解可以通过一系列局部最优的选择来达到) 最优子结构性质:问题的最优解包含子问题的最优解 贪心算法 ...

  4. java活动安排_贪心法求解活动安排(java实现)

    贪心法描述: 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优 ...

  5. 贪心法求解汽车加油问题

    文章目录 问题内容 贪心法思想 问题分析 代码 结果展示 遇到的问题 问题内容 已知一辆汽车加满油后可行驶d(如d=7)km,而旅途中有若干个加油站.编写一个实验程序指出应在哪些加油站停靠加油,使加油 ...

  6. 贪心法求解磁盘驱动调度问题

    磁盘驱动调度问题 题目: 输入一个请求序列: 98,183,37,122,14,124,65,67 n=8 假设磁头一开始的位置start处于c(c不在序列中的任何位置),例如c=53 如果采用最短寻 ...

  7. 回溯法求解背包问题java_背包问题回溯法的递归实现(java)

    0-1背包问题,在搜索过程中使用递归来完成. package com.test; class Pack { int n = 8; //物品个数 int W = 110; //背包总容量 int[] W ...

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

    问题:给定n个物品和一个容量为C的背包,物品i的重量为w 其价值为v.背包问题就是如何如何选择背包的物品,使装入背包中的物品的总价值是最大的,注意和0/1背包问题的区别,在背包问题中可以将某种物品的一 ...

  9. 基于贪心法及其改进算法求解旅行商问题(附代码)

    旅行商问题 TSP (Traveling Salesman Problem)又称旅行推销员问题是指对于给 定的 n 个城市旅行商从某一城市出发不重复地访问其余每一城市后回到出发的城市 寻找一条使总旅行 ...

最新文章

  1. POJ - 3160 Father Christmas flymouse DAG最长路
  2. 一文读懂公有链、私有链、联盟链
  3. Java对多线程的支持
  4. ASP.NET配置错误页面浅析
  5. koa router ajax,ajax 请求 koa2 router.post 404
  6. HTML5主要新增标签
  7. Springboot微服务开发教程系列:开发入门
  8. FFMpeg在Windows环境下的编译
  9. 私有镜像仓库的部署与使用方法
  10. 自己在win10中添加ADO控件步骤总结
  11. 深度优先,广度优先,拓扑排序(实战题解)
  12. 写给非网工的CCNA教程(1)IP地址和MAC地址
  13. JAVA使用pdfbox将pdf转换成图片
  14. 2023 txl短信相册通讯录APP获取 双端完美版
  15. 一些个人笔记,持续更新ing
  16. 无意看到的一篇文章,有我的影子
  17. 电路板PCB夹具设计与测试看法
  18. LCA(倍增+Tarjan)和BFS、DFS以及Prim、Kruskal
  19. VMware虚拟机软件安装国产操作系统 统信 UOS V20 1050e 手把手保姆教程
  20. 1w存银行一年多少利息_我把100万存银行一年利息是多少钱?

热门文章

  1. 为什么会出现中文乱码?
  2. 管理的几大基本职能和要求
  3. 数学原理-高等数学复习笔记 ——1.1 泰勒公式 泰勒展开式
  4. 设计图纸管理-图纸管理系统哪家好呢
  5. 高效的技术图纸管理系统有哪些价值
  6. python之cv2动态绘制图形
  7. python用于pmc排产可以吗_PMC-你最想要的实用干货来了!
  8. 该网页无法正常运作 目前无法处理此请求HTTP ERROR 500
  9. UTF-8编码的意义
  10. 蒙特卡洛射线追踪_什么是射线追踪?