首页 > 其他分享 >c语言回溯法实现01背包问题

c语言回溯法实现01背包问题

时间:2023-12-21 21:02:47浏览次数:29  
标签:01 int price float ++ bestx 回溯 bestp 背包

w[N],p[N]中直接装的是样例,可以修改数据,别忘记修改N。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define N 5


//0-1背包,用三种算法实现
//动态规划,贪心,回溯,分支限界

void Output(int bestx[]);
int Constraint(int t);
float Bound(int i);
void BackTrack(int i);


int cp = 0, cw = 0;
int bestp = 0;//最好重量
int c = 17;
int x[N] = { 0 };//解向量
int w[N] = { 3,4,5,10,8 };//物品重量
int p[N] = { 5,6,10,30,17 };//物品价值
int bestx[N] = { 0 };


int main()
{
	//int bestx[N] = { 0 };
	BackTrack(0);
	for (int i = 0; i < N; i++)
	{
		printf("%d ", bestx[i]);
	}
	printf("%d", bestp);
	return 0;
}

void Output()
{
	int price = 0;
	for (int i = 0; i < N; i++)//一个一个尝试
	{
		if (x[i])
		{
			price = price + p[i];
		}
		if (price > bestp)
		{
			bestp = price;
			for (int j = 0; j < N; j++)
			{
				bestx[j] = x[j];
			}
		}
	}
}

int Constraint(int t)
{
	int contain = 0;
	for (int i = 0; i <= t; i++)
	{
		if (x[i])
		{
			contain = contain + w[i];
		}
		if (contain <= c)
		{
			return 1;
		}
		else
			return 0;
	}
}

void BackTrack(int i)
{
	if (i == N)//到达叶子结点
	{
		if (cp >= bestp)
		{
			bestp = cp;
			for (i = 0; i < N; i++)
			{
				bestx[i] = x[i];
			}
		}
		return;
	}
	if (cw + w[i] <= c)//左子树
	{
		x[i] = 1;
		cw += w[i];
		cp += p[i];
		BackTrack(i + 1);
		cw -= w[i];
		cp -= p[i];
	}
	if (Bound(i+1) > bestp)//右子树
	{
		x[i] = 0;
		BackTrack(i + 1);
	}
}



//最大重量
float Bound(int i)
{
	float cleft = c - cw;
	float b = cp;
	while (i < N && w[i] <= cleft)
	{
		cleft -= w[i];
		b += p[i];
		i++;
	}
	if (i < N)
	{
		b += p[i] / w[i] * cleft;
	}
	return b;
}

标签:01,int,price,float,++,bestx,回溯,bestp,背包
From: https://blog.51cto.com/u_15736615/8926745

相关文章

  • P5289 [十二省联考 2019] 皮配 题解
    题目链接点击打开链接题目解法题意比较复杂,形式化一下题意是:一些人和一些城市,每个人属于一个城市,每个人属于\(A/B/C/D\)队,需要满足:每个城市中的人要么都属于\(AC\)或\(BD\),且\(A+C\leC_0,\;B+D\leC_1,\;A+B\leD_0,\;C+D\leD_1\)暴力\(dp\)是\(f_{i,a,b,c}\)表......
  • class073 背包dp-01背包、有依赖的背包【算法】
    class073背包dp-01背包、有依赖的背包【算法】算法讲解073【必备】背包dp-01背包、有依赖的背包code1P1048[NOIP2005普及组]采药//01背包(模版)//给定一个正数t,表示背包的容量//有m个货物,每个货物可以选择一次//每个货物有自己的体积costs[i]和价值values[i]//返回在......
  • class074 背包dp-分组背包、完全背包【算法】
    class074背包dp-分组背包、完全背包【算法】算法讲解074【必备】背包dp-分组背包、完全背包code1P1757通天之分组背包//分组背包(模版)//给定一个正数m表示背包的容量,有n个货物可供挑选//每个货物有自己的体积(容量消耗)、价值(获得收益)、组号(分组)//同一个组的物品只......
  • Landsat7_C2_ST数据集2019年1月-2022年12月
    简介:Landsat7_C2_ST数据集是经大气校正后的地表温度数据,属于Collection2的二级数据产品,以开尔文为单位测量地球表面温度,是全球能量平衡研究和水文模拟中的重要地球物理参数。地表温度数据还有助于监测作物和植被健康状况,以及极端高温事件,如自然灾害(如火山爆发、野火)和城市热岛效......
  • 算法分析-动态规划-求解0-1背包问题
    一.题目需求 使用一个体积大小为13的背包,选择一件或多件商品带走,使得所选商品总价值最大。商品列表如下: 二.算法思想1,这是一个经典的0-1背包问题它要求我们在一组物品中选择一些,每个物品只能选择一次或者不选择,目标是使得所选物品的总价值最大。这个问题在实际生活中有很......
  • VisualStudio2019创建Code Snippet
    CodeSnippet是什么CodeSnippet,与其称其为代码片段(CodeBlock),将它翻译成代码模板(CodeTemplate)可能更合适一些。任何一段代码都可以叫做代码片段,我们这里要讲的不是这种随性的东西,而是一种快速生成代码的快捷方式,通过它可以有效地提高我们的编程效率。举个例子,假如你在C#......
  • U388010 题解
    洛谷U388010题解link:https://www.luogu.com.cn/problem/U388010Sol首先,我们看到这一条件:对于每一个\(1\lei\len\),\(1\lej\len\),\(i\neqj\)满足\(a_i\bmoda_j\neq0,\a_j\bmoda_i\neq0\)。我们知道,质数的因数只有\(1\)和本身,所以当序列里全是质数......
  • [2019 集训队互测 Day 4]绝目编诗
    题意给出一个\(n\)个点\(m\)条边的简单无向图,判断是否存在两个长度相同的简单环。题解发现环的个数超过\(n\)的时候,一定有两个长度相同的简单环。当\(m\ge2n\)的时候,环的个数达到了\(n+1\),一定有两个长度相同的环。所以\(m\)比较大的情况就略去了。在考虑如何......
  • 【洛谷】P1024 [NOIP2001 提高组] 一元三次方程求解 (二分)
    题目描述见此:P1024如何求一个方程的根呢qwq首先,根是什么,函数y=f(x)有零点⇔方程f(x)=0有实数根⇔函数y=f(x)的图象与x轴有交点。回顾我们高一学过的一个定理:零点存在性定理:如果函数y=f(x)在区间[a,b]上的图象是连续不断的一条曲线,并且有f(a)·f(b)<0,那么,函数y=f(x)在区间(a,b)......
  • 李强 分布式计算、云计算与大数据 作者:林伟伟 著出版社:机械工业出版社出版时间:20
    前言背景分布式计算从20世纪六七十年代发展到现在,一直是计算机科学技术的理论与应用的热点问题,特别是*近几年,随着互联网、移动互联网、社交网络应用的发展,急需分布式计算的新技术——云计算、大数据,以满足和实现新时代计算机的应用需求。云计算、大数据等新技术本质上是分布式计......