贪心算法解决背包问题和动态规划解决0-1背包问题(c语言)

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

贪心算法解决背包问题(c语言)

#include<stdio.h>
struct goods{
	int w;//商品重量
	int p;//商品价值
	double avg;//单位商品的价值
};


double beibao(goods g[],int c,int N,double X[]){
	double v=0;
	for(int i=0;i<N;i++){
		if(c<g[i].w){
			if(c>0){
				X[i]=(double)c/(double)g[i].w;
				v=v+c*g[i].avg;
				c=0;
			}else break;
		}else{
			v=v+g[i].p;
			c=c-g[i].w;
			X[i]=1;
		}
	}
	return v;
}
void sort(goods g[],int N){
	for(int i=0;i<=N-1;i++){
		for(int j=0;j<=N-1-i;j++){
			
			if(g[j].avg>g[++j].avg){
				goods x;
				x=g[j];
				g[j] =g[++j];
				g[++j] =x;
			}
		}
	}
}
void main(){
	int N=3;
	double X[3]={0,0,0};
	goods g[3];
	printf("请输入背包的重量:");
	int c;
	scanf("%d",&c);
	for(int i=0;i<N;i++){
		printf("请输入第%d个商品的重量:",i+1);
		scanf("%d",&g[i].w);
		printf("请输入第%d个商品的价值:",i+1);
		scanf("%d",&g[i].p);
		g[i].avg=(double)g[i].p/(double)g[i].w;
	}
	sort(g,N);
	double v=beibao(g,c,N,X);
	for (int j=0;j<N;j++){
		printf("第%d个商品: %d,%d\n",j+1,g[j].w,g[j].p);
	}
	printf("解向量为:\n");
	for(int k=0;k<N;k++){
		printf("%f\n",X[k]);
	}
	printf("价值最大为:%f",v);

	
}


运行结果如下:
c语言贪心算法解决该背包问题,贪心算法,动态规划,c语言

动态规划求解0-1背包问题(c语言)

#include<stdio.h>
void main(){
int w[3]={3,2,4}; //物品重量
int p[3]={5,3,6}; //物品价值
int x[4][7];
int Z=6; //背包的总重量
for(int i=0;i<=6;i++){
	x[0][i]=0;
}
for(int j=0;j<=3;j++){
	x[j][0]=0;
}
//填表
for(int m=1;m<=3;m++){
	for(int n=1;n<=6;n++){
		if(w[m-1]>n)
			x[m][n]=x[m-1][n];
		else{
			int value1=x[m-1][n];
			int value2=x[m-1][n-w[m-1]]+p[m-1];
			if(value2>value1)
				x[m][n]=value2;
			else
				x[m][n]=value1;
		}
	}
}
//打印表
for(int c=0;c<=3;c++){
	for(int d=0;d<=6;d++){
		printf("%3d",x[c][d]);
}
	printf("\n");
}

int q[3]={0,0,0}; //选取方案,选了则为1,不选则为0
int l=6;
for(int k=3;k>=0;k--){
		if(x[k][l]==x[k-1][l]){
			q[k-1]=0;
		}else if(x[k][l]==x[k-1][l-w[k-1]]+p[k-1]&&j-w[k-1]>=0){
			q[k-1]=1;
			l=l-w[k-1];
		}
	}

printf("总价值最大为:%d\n",x[3][6]);
//选取方案
printf("选取方案为(0代表该物品未选择,1代表该物品被选择):\n");
for(int v=0;v<3;v++){
	printf("%3d",q[v]);
}
printf("\n");

}

运行结果如下:

c语言贪心算法解决该背包问题,贪心算法,动态规划,c语言

总结:

贪心算法:

每一步都做出当时看起来最佳的选择,也就是说,它总是做出局部最优的选择。

贪心算法的设计步骤:

  1. 对其作出一个选择后,只剩下一个子问题需要求解。
  2. 证明做出贪心选择后,原问题总是存在最优解,即贪心选择总是安全的。
  3. 剩余子问题的最优解与贪心选择组合即可得到原问题的最优解。

动态规划:

应用于子问题重合的情况,不同的子问题具有相同的子子问题,

动态规划算法将每个子问题求解一次,将其解保存在一个表格中,需要时进行调用。

  1. 刻画一个最优解的结构特征。
  2. 递归的定义最优解的值。
  3. 计算最优解的值,有自顶向下和自底向上的方法,通常采用自底向上的方法。

贪心算法和动态规划算法的区别:

1.贪心:每一步的最优解一定包含上一步的最优解,上一步之前的最优解则不作保留;

动态规划:全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有的局部最优解 。

2.动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常自顶向下的方式进行。

3.根据以上两条可以知道,贪心不能保证求得的最后解是最佳的,一般复杂度低;而动态规划本质是穷举法,可以保证结果是最佳的,复杂度高。文章来源地址https://www.toymoban.com/news/detail-764853.html

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

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

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

相关文章

  • java实现0-1背包问题方案(动态规划-贪心算法-回溯-分支定界)

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

    2024年02月01日
    浏览(129)
  • 01背包(动态规划,贪心算法,回溯法,分支限界法)

    有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? number=4,capacity=8 物品编号(i) W(体积) V(价值) 1 2 3 2 3 4 3 4 5 4 5 6 1.什么是动态规划 1.动态规划算法是通过拆分问题,定义问题状态和状态之间的关系, 使得

    2024年02月08日
    浏览(68)
  • C语言动态规划解决0-1背包问题

    动态规划(Dynamic Programming,简称DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,它能够将问题分解为相互独立的子问题,并将子问题的解存储

    2024年04月28日
    浏览(41)
  • 【Java实现】动态规划算法解决01背包问题

    1、问题描述: 一个旅行者有一个最多能装m公斤的背包,现在有n中物品,每件的重量分别是W1、W2、……、Wn,每件物品的价值分别为C1、C2、……、Cn, 需要将物品放入背包中,要怎么样放才能保证背包中物品的总价值最大? 2、动态规划算法的概述 1)动态规划(Dynamic Progra

    2023年04月09日
    浏览(56)
  • (C语言贪心算法)0/1背包问题

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

    2024年02月08日
    浏览(41)
  • 算法系列--动态规划--背包问题(3)--完全背包介绍

    💕\\\"Su7\\\"💕 作者:Lvzi 文章主要内容:算法系列–动态规划–背包问题(3)–完全背包介绍 大家好,今天为大家带来的是 算法系列--动态规划--背包问题(3)--完全背包介绍 链接: 完全背包 可以发现完全背包问题和01背包问题还是特比相似的 分析: 完全背包问题 是 01背包问题 的推广

    2024年04月25日
    浏览(45)
  • 算法系列--动态规划--背包问题(1)--01背包介绍

    💕\\\"趁着年轻,做一些比较cool的事情\\\"💕 作者:Lvzi 文章主要内容:算法系列–动态规划–背包问题(1)–01背包介绍 大家好,今天为大家带来的是 算法系列--动态规划--背包问题(1)--01背包介绍 背包问题是动态规划中经典的一类问题,经常在笔试面试中出现,是非常 具有区分度 的题

    2024年04月16日
    浏览(55)
  • 【算法-动态规划】0-1 背包问题

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月08日
    浏览(46)
  • 算法学习17-动态规划01:背包问题

    提示:以下是本篇文章正文内容: 提示:这里对文章进行总结: 💕💕💕

    2024年04月27日
    浏览(52)
  • C++ DP算法,动态规划——背包问题(背包九讲)

    有N件物品和一个容量为 V V V 的背包。放入第i件物品耗费的空间是 C i C_i C i ​ ,得到的价值是 W i W_i W i ​ 。 求解将哪些物品装入背包可使价值总和最大。 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 用子问题定义状态:即 F [ i , v ] F[i, v] F

    2024年02月16日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包