背包问题-递归思想(C语言)
目录
问题描述
问题示例
输入输出
递归定义
递归函数
用法示例:
结果展示
问题描述
设有一个背包可以放入物品的重量为s,现有n件物品,重量分别为w[0], w[1], …,w[n - 1]。
能否从这n件物品中选择若干件放入此背包使得放入的重量之和正好等于s。
如果存在一种符合上述要求的选择,则称此背包问题有解:否则,称此背包问题无解。
问题示例
s = 10,n=6, 物品重量为{ 1,8,4,3,5,2 }时
可找到下列4组解:{ 1,4,3,2 },{ 1,4,5 },{ 8,2 },{ 3,5,2 }。
输入输出
用户输入重量s、n以及n件物品的重量
如果有解则输出所有的解。
如果无解,则输出背包问题无解。
递归定义
true表示有解,false表示无解
s=0 true 此时问题有解
s<0或者n<1 false 总重量和物品件数不能为负数
s>0且n>=1 KNAP(s,w,n-1) 所选物品不包括w[n-1]
s>0且n>=1 KNAP(s-w[n-1],n-1) 所选物品包括w[n-1]
递归函数
int pick[6] = { 0 };//记录要打印的物品的下标
int sz = 0;//记录打印答案的个数
int flag = 0; //标志符号:记录有没有解 int KNAP(int s, int w[], int n)
{if (s == 0){printf("{ ");for (int i = 0; i < sz; i++){printf("%d ", w[pick[i]]);}printf("},");flag = 1;return 1;}else if (s < 0 || n < 1)return 0;else{KNAP(s, w, n - 1);//所选物品不包括w[n-1]pick[sz++] = n - 1;//记录要打印的物品的下标 KNAP(s - w[n - 1], w, n - 1);// 所选物品包括w[n-1] sz--;}return flag;
}
用法示例:
#include<stdio.h>
int pick[6] = { 0 };//记录要打印的物品的下标
int sz = 0;//记录打印答案的个数
int flag = 0; //标志符号:记录有没有解 int KNAP(int s, int w[], int n)
{if (s == 0){printf("{ ");for (int i = 0; i < sz; i++){printf("%d ", w[pick[i]]);}printf("},");flag = 1;return 1;}else if (s < 0 || n < 1)return 0;else{KNAP(s, w, n - 1);//所选物品不包括w[n-1]pick[sz++] = n - 1;KNAP(s - w[n - 1], w, n - 1);// 所选物品包括w[n-1] sz--;}return flag;
}int main()
{int s= 0;int n = 0;int w[100] = { 0 };printf("请输入一个背包可以放入物品的重量:\n");scanf_s("%d", &s);printf("请输入物品的个数:\n");scanf_s("%d", &n);printf("请输入物品的重量:\n");for (int i = 0; i < n; i++){scanf_s("%d", &w[i]);}if (KNAP(s, w, n))printf("有解\n");elseprintf("背包问题\n");return 0;
}
结果展示
背包问题-递归思想(C语言)相关推荐
- 吓得我抱起了抱着我的小鲤鱼的我(递归思想)C语言
题目要求 假设递归函数形式为recursion(int level) 要求: recursion(0)输出内容为: 吓得我抱起了我的小鲤鱼 recursion(2)输出内容为: 吓得我抱起了抱着 ...
- 如何用递归思想 求n的阶乘 C语言
如何用递归思想 求n的阶乘 C语言 首先,我讲一下什么是递归? 一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数.执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函 ...
- C语言递归思想实现汉诺塔
目录 1.递归思想简介 2.汉诺塔问题 3.汉诺塔递归的c语言实现 1.递归思想简介 在c语言中,程序调用自身的编程技巧称为递归( recursion). 递归的定义看上去似乎很抽象,使用代码描述能够 ...
- 【算法】学习笔记(2):递归思想
0 回顾 之前的笔记(0)和笔记(1),我们介绍了算法的基本含义,并且举了一些实例,同时理解了,算法就是人类在教计算机做事情! 我们知道,算法就是解决问题的方案,我们将自然语言描述的问题,转换为符号语 ...
- 汉诺塔问题(递归思想)(堆栈学习)
#include<stdio.h>//汉诺塔问题运用到递归思想, int num=0 ;//首先要给大家介绍一下堆栈 //想象一下,有一个递归函数当他执行自己本身的程序时 //因为条件满足 ...
- 汉诺塔递归的c语言实现(递归)
对于递归来讲, 汉诺塔实际是经典到不能再经典的例子了, 每个数据结构的教材对会提到. 但是到最后只给出一段类似下面的一段代码: #include<stdio.h>void move(i ...
- 递归思想解决输出目录下的全部文件
刚刚了解了下递归思想 递归就是在方法内调用本方法 下面说一个实际的应用 输出目录下的全部文件,当目录中还有目录时,则进入目录输出里面的文件 import java.io.*; class ShowFi ...
- Javascript函数之深入浅出递归思想,附案例与代码!
作者 | 浮世万千吾爱有三 责编 | Carol 来源 | CSDN 博客 递归函数的理解 1.生活中的递归 "递归"在生活中的一个典例就是"问路".如图小哥哥 ...
- ----斐波那契数列---eval函数----类递归思想 栈 进出 思想
------------ 斐波那契 数列 --------------- [1,1,2,3,5,8,13,21,34,...] 1 列表方法实现 # l=[1,1] # # # while len(l ...
- 匿名函数自我调用_Python中的匿名函数及递归思想简析
匿名函数 前言 上次咱们基本说了一下函数的定义及简单使用,Python中的基本函数及其常用用法简析,现在咱们整点进阶一些的.同样都是小白,咱也不知道实际需要不,但是对于函数的执行顺序以及装饰器的理解还 ...
最新文章
- mysql安装好需要优化配置一下_Mysql的安装、配置、优化
- 一个低级错误,关于timer
- 同一事务多次加for_谈谈事务隔离级别,以及悲观锁和乐观锁的原理和应用场景...
- 去空白符的大文本字符统计(洛谷P5015题题解,Java语言描述)
- 视频分辨率和音频质量_高分辨率音频的声音是否比CD质量好?
- Redis单机版半自动安装
- html 音标显示乱码,网页显示音标/拼音显示乱码的解决办法(.net)
- php api 文档 管理,Api开发者福利之api在线管理,模拟请求测试,文档生成工具--Apizza...
- Web 方向学习路线
- 工科数学分析大作业(三) 傅里叶级数
- 实时消息传输协议 RTMP Real Time Messaging Protocol
- 个人笔记:kali firefox安装hackbar插件
- 资金安全责任险对个人账户负责?
- 全球与中国汽车检测设备市场现状及未来发展趋势
- python爬虫:搜狗微信公众号文章信息的采集(https://weixin.sogou.com/),保存csv文件
- destoon模板安装方法
- C语言 存储类型关键字详解
- 基于Python爬取福建省莆田市天气预报数据获取与预处理的设计与实现
- excel公式编写简化,Python生成公式
- 实现ALOHA协议仿真算法