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

这篇具有很好参考价值的文章主要介绍了c++—0/1背包问题--贪心算法(详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

贪心算法的基本思想

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

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

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

贪心算法的基本要素

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

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

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

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

贪心算法:

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

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

完整代码:

运行:

3 50

10 20 30

60 100 120

3 50

30 10 20

120 60 100

#include<bits/stdc++.h>
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(temp1<temp2)
//    	    {
//    	        swap(w[j],w[j+1]);
//    	        swap(v[j],v[j+1]);
//    	    }
//    	}
//	}
//}

//插入排序 
void Sort1(int n,double w[],double v[]){
	int max1;
	double t[20];
	for(int i=1;i<=n;i++){
		t[i]=v[i]/w[i];
		//cout<<t[i]<<endl;
	}
	for(int i=1;i<=n;i++){
		max1=i;
		for(int j=i+1;j<=n;j++){
			if(t[j]>t[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<<t[i]<<endl;
	}
}
//n为物品数量,c为背包最大容量,w[]为物品重量,v[]为物品价值,b[]为背包存放 
void knapsack_greedy(int n,double c,double w[],double v[],double b[]){
	int j;
    //Sort1(n,w,v);
	Sort1(n,w,v);
	for(int i=1;i<=n;i++)//初始化背包b[]
		b[i]=0;
	for(j=1;j<=n;j++){
		if(c<w[j]) break;
		b[j]=1;
		c=c-w[j];
	} 
	if(j<=n)
		b[j]=c/w[j];
	cout<<"输出:"<<endl;
	for(int i=1;i<=n;i++){
		cout<<"物品重量为:"<<w[i]<<" "<<"物品比例"<<b[i]<<endl;
	}
}
int main(){
	int n,c;
	double b[20],w[20],v[20];
	cout<<"输入物品数量和背包容量:";
	cin>>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<n;i++)//初始化背包b[]
		b[i]=0;
for(j=0;j<n;j++){
		if(c<w[j]) break;
		b[j]=1;
		c=c-w[j];
} 

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。

代码结果:

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

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

 

 请指教!!文章来源地址https://www.toymoban.com/news/detail-443183.html

到了这里,关于c++—0/1背包问题--贪心算法(详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【趣学算法】Day3 贪心算法——背包问题

    14天阅读挑战赛 努力是为了不平庸~ 算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!  ❤️一名热爱Java的大一学生,希望与各位大佬共同学习进步❤️ 🧑个人主页:@周小末天天开心 各位大佬的点赞👍 收藏⭐ 关注✅,是本人学习的最大动力 感谢! 📕该

    2024年02月02日
    浏览(31)
  • 【程序设计竞赛算法】背包问题——贪心法

    贪心算法是一种基于贪心策略的算法,它在每一步选择中都采取当前状态下的最优选择,以期望最终达到全局最优解。 背包问题是一个经典的组合优化问题,可以分为 0-1 背包问题和分数背包问题。其中,0-1 背包问题要求物品只能选择一次,而分数背包问题允许物品被选择多

    2024年02月03日
    浏览(32)
  • (C语言贪心算法)0/1背包问题

    已知一个载重为M的背包和n件物品,物品编号从0到n-1。第i件物品的重量为 wi,若将第i种物品装入背包将获益pi,这里,wi0,pi0,0=in。所谓0/1背包问题是指在物品不能分割,只能整件装入背包或不装入的情况下,求一种最佳装载方案使得总收益最大。 第 1 行中有 2 个正整

    2024年02月08日
    浏览(29)
  • C++常见排序算法——冒泡排序算法

    首先说一下冒泡排序的基本算法思想: 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸

    2023年04月08日
    浏览(26)
  • 排序算法之详解冒泡排序

    冒泡排序顾名思义,就是像冒泡一样,泡泡在水里慢慢升上来,由小变大。 虽然冒泡排序和冒泡并不完全一样,但却可以帮助我们理解冒泡排序。 一组无序的数组,要求我们从小到大排列 我们可以先将最大的元素放在数组末尾 再将第二大的数放在数组的倒数第二个位置 再

    2023年04月25日
    浏览(80)
  • C++算法之冒泡排序

    试想一下,如果在上体育课的时候,通常学生都会随意站成一列,但是体育老师会帮忙调整学生的站位使得最终顺序是按照身高排序的。那么,回忆一下体育老师是如何调整顺序的呢? 假设体育老师想将学生从左到右按照身高从矮到高排序。通常情况下,他会从左到右扫视学

    2024年02月14日
    浏览(28)
  • 排序算法——冒泡排序详解及优化

    对于一个排序算法,假设两个相同的元素Ai和Aj· 在排序前这两个元素满足条件ij,即Ai在Aj之前· 在排序后Ai仍在Aj之前,则称为排序算法为稳定排序· 否则称这个算法为不稳定排序 稳定性的说明 排序的稳定性并不影响排序算法的效率,稳定性只对类/结构体类型数据有影响 这

    2024年02月06日
    浏览(27)
  • 两个基本排序算法【选择排序,冒泡排序】【详解】

    一、前言 二、选择排序 2.1 选择排序(基础版)【必会】 2.2 选择排序(优化版) 三、冒泡排序 3.1 冒泡排序(基础版)【必会】 3.2 冒泡排序(外循环优化版) 3.3 冒泡排序(内循环优化版) 四、总结   排序法主要分为两种: 比较排序 和 非比较排序 。常见的比较排序有

    2024年02月03日
    浏览(24)
  • java实现0-1背包问题方案(动态规划-贪心算法-回溯-分支定界)

    动态规划算法时间复杂度较低,能够求解较大规模的问题,但空间复杂度较高,不适用于数据量较大的问题。 贪心算法时间复杂度较低,能够求解较大规模的问题,但不能保证求得的解是最优解。 回溯算法能够求解较小规模的问题,但时间复杂度较高,不适用于数据量较大

    2024年02月01日
    浏览(92)
  • C++实现冒泡排序算法(含源码)

    C++实现冒泡排序算法(含源码) 冒泡排序是一种简单的排序算法,它通过不断交换相邻的元素,将较大的元素逐步\\\"浮\\\"到待排序列的尾部,从而实现排序。下面是C++的冒泡排序实现代码: 该函数接受一个整型数组和数组长度作为参数,在每次遍历中,它比较相邻的两个元素,将

    2024年02月07日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包