栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++—0/1背包问题--贪心算法(详解)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++—0/1背包问题--贪心算法(详解)

此算法用冒泡排序和选择排序实现的!!

贪心算法的基本思想

•贪心算法的特点是每个阶段所作的选择都是局部最优的,它期望通过所作的局部最优选择产生出一个全局最优解。

贪心与动态规划:与动态规划不同的是,贪心是鼠目寸光;动态规划是统揽全局。

贪心:每个阶段产生的都是局部最优解

贪心算法的基本要素

•贪心选择性质:所求问题的全局最优解可以通过一系列局部最优的选择(即贪心选择)来达到。

–这是贪心算法与动态规划算法的主要区别。

•最优子结构性质:当原问题的最优解包含子问题的最优解时,称此问题具有最优子结构性质。

最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征

贪心算法:

完整代码:

运行:

3 50

10 20 30

60 100 120

3 50

30 10 20

120 60 100

#include
using namespace std;
//冒泡排序 
//void Sort(int n,double w[],double v[])
//{
//    int i,j;
//    float temp1,temp2;
//    for(i=1;i<=n;i++){
//    	for(j=1;j<=n-i;j++)//冒泡排序
//    	{
//    	    temp1=v[j]/w[j];
//    	    temp2=v[j+1]/w[j+1];
//    	    if(temp1t[max1]){
				max1=j;
			}
		}
		swap(t[i],t[max1]);
		swap(w[i],w[max1]);
		swap(v[i],v[max1]);
	}
	for(int i=1;i<=n;i++){
		cout<>n>>c;
	cout<<"输入物品重量(如:30 10 20):"; 
	for(int i=1;i<=n;i++)
		cin>>w[i];
	cout<<"输入物品的价值(如:120 60 100):"; 
	for(int i=1;i<=n;i++)
		cin>>v[i];
	knapsack_greedy(n,c,w,v,b);	
	return 0;
}

代码解析:

//Sort1(n,w,v);
	Sort1(n,w,v);

1.此函数用来在计算单位价值后排序,使得按照最大单位价值来从大到小排序(然后依次装入背包)。

for(int i=0;i 
 

2.首先这是0/1背包问题,在数组b[]中存放的就是0或者1。第一个循环语句初始化为0,表示还没有装物品。

0或1表示的是:物品一整个全部装进去物品比例为1,完全没有装进去物品比例为0,如果背包容量未满,还能装下一个物品的一部分,那么就用剩余的背包容量/这个物品的重量(装进去的物品比例 :c/w[i] )---为小数(标红句子看下述代码)。

if(j<=n)
	b[j]=c/w[j];

在退出循环后,继续判断,物品还未装完,用剩余的背包容量/这个物品的重量(c/w[i])---为小数,也可能为0。

代码结果:

 

 

 

 请指教!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/879538.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号