目录

问题描述

问题示例

输入输出

递归定义

递归函数

用法示例:

结果展示


问题描述

设有一个背包可以放入物品的重量为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语言)相关推荐

  1. 吓得我抱起了抱着我的小鲤鱼的我(递归思想)C语言

    题目要求 假设递归函数形式为recursion(int  level) 要求: recursion(0)输出内容为:  吓得我抱起了我的小鲤鱼 recursion(2)输出内容为:  吓得我抱起了抱着 ...

  2. 如何用递归思想 求n的阶乘 C语言

    如何用递归思想 求n的阶乘 C语言 首先,我讲一下什么是递归? 一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数.执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函 ...

  3. C语言递归思想实现汉诺塔

    目录 1.递归思想简介 2.汉诺塔问题 3.汉诺塔递归的c语言实现 1.递归思想简介 在c语言中,程序调用自身的编程技巧称为递归( recursion). 递归的定义看上去似乎很抽象,使用代码描述能够 ...

  4. 【算法】学习笔记(2):递归思想

    0 回顾 之前的笔记(0)和笔记(1),我们介绍了算法的基本含义,并且举了一些实例,同时理解了,算法就是人类在教计算机做事情! 我们知道,算法就是解决问题的方案,我们将自然语言描述的问题,转换为符号语 ...

  5. 汉诺塔问题(递归思想)(堆栈学习)

    #include<stdio.h>//汉诺塔问题运用到递归思想, int num=0 ;//首先要给大家介绍一下堆栈 //想象一下,有一个递归函数当他执行自己本身的程序时 //因为条件满足 ...

  6. 汉诺塔递归的c语言实现(递归)

    对于递归来讲, 汉诺塔实际是经典到不能再经典的例子了,   每个数据结构的教材对会提到. 但是到最后只给出一段类似下面的一段代码: #include<stdio.h>void move(i ...

  7. 递归思想解决输出目录下的全部文件

    刚刚了解了下递归思想 递归就是在方法内调用本方法 下面说一个实际的应用 输出目录下的全部文件,当目录中还有目录时,则进入目录输出里面的文件 import java.io.*; class ShowFi ...

  8. Javascript函数之深入浅出递归思想,附案例与代码!

    作者 | 浮世万千吾爱有三 责编 | Carol 来源 | CSDN 博客 递归函数的理解 1.生活中的递归 "递归"在生活中的一个典例就是"问路".如图小哥哥 ...

  9. ----斐波那契数列---eval函数----类递归思想 栈 进出 思想

    ------------ 斐波那契 数列 --------------- [1,1,2,3,5,8,13,21,34,...] 1 列表方法实现 # l=[1,1] # # # while len(l ...

  10. 匿名函数自我调用_Python中的匿名函数及递归思想简析

    匿名函数 前言 上次咱们基本说了一下函数的定义及简单使用,Python中的基本函数及其常用用法简析,现在咱们整点进阶一些的.同样都是小白,咱也不知道实际需要不,但是对于函数的执行顺序以及装饰器的理解还 ...

最新文章

  1. mysql安装好需要优化配置一下_Mysql的安装、配置、优化
  2. 一个低级错误,关于timer
  3. 同一事务多次加for_谈谈事务隔离级别,以及悲观锁和乐观锁的原理和应用场景...
  4. 去空白符的大文本字符统计(洛谷P5015题题解,Java语言描述)
  5. 视频分辨率和音频质量_高分辨率音频的声音是否比CD质量好?
  6. Redis单机版半自动安装
  7. html 音标显示乱码,网页显示音标/拼音显示乱码的解决办法(.net)
  8. php api 文档 管理,Api开发者福利之api在线管理,模拟请求测试,文档生成工具--Apizza...
  9. Web 方向学习路线
  10. 工科数学分析大作业(三) 傅里叶级数
  11. 实时消息传输协议 RTMP Real Time Messaging Protocol
  12. 个人笔记:kali firefox安装hackbar插件
  13. 资金安全责任险对个人账户负责?
  14. 全球与中国汽车检测设备市场现状及未来发展趋势
  15. python爬虫:搜狗微信公众号文章信息的采集(https://weixin.sogou.com/),保存csv文件
  16. destoon模板安装方法
  17. C语言 存储类型关键字详解
  18. 基于Python爬取福建省莆田市天气预报数据获取与预处理的设计与实现
  19. excel公式编写简化,Python生成公式
  20. 实现ALOHA协议仿真算法

热门文章

  1. webstorm+node之debug
  2. 开源项目管理软件产品对比分析资料整理
  3. nexus的下载与安装和启动
  4. python 爬电影名网址评分及导演代码和运行结果
  5. 用HFFS实例讲解多频天线设计
  6. android开源库汇总
  7. 电商系统架构全链路解析
  8. 弱电设计:智能建筑设计标准GB50314-2015,pdf版本
  9. 计算机半小时后关机代码,电脑自动关机代码
  10. 电磁兼容(EMC)标准结构的划分与分类