/*1.问题描述

假设有一个能装入总体积为T的背包和n件体积分别为w1,w2,…wn的物品,

能否从n件物品中挑选若干件恰好装满背包,即使w1+w2+…+wm=T,

要求找出所有满足上述条件的解。

例如:

当T=10,各件物品的体积{1,8,4,3,5,2}时,可找到下列4组解:

(1,4,3,2)

(1,4,5)

(8,2)

(3,5,2)。

2.实现提示

可利用回溯法的设计思想来解决背包问题。首先,将物品排成一列,然后,

顺序选取物品装入背包,若已选取第i件物品后未满,则继续选取第i+1件,

若该件物品“太大”不能装入,则弃之,继续选取下一件,直至背包装满为止。

如果在剩余的物品中找不到合适的物品以填满背包,则说明“刚刚”装入的物品

“不合适”,应将它取出“弃之一边”,继续再从“它之后”的物品中选取,如此

重复,直到求得满足条件的解,或者无解。

由于回溯求解的规则是“后进先出”,自然要用到“栈”。

3.进一步考虑:

如果每件物品都有体积和价值,背包又有大小限制,求解背包中存放物

品总价值最大的问题解---最优解或近似最优解。*/#include#includestructnode

{intsum;inti;

};

typedefstructnode NODE;intgetmemory(int**p,intsize)

{if(0>=size)returnNULL;if(NULL==(*p=(int*)malloc(size*(sizeof(int)))))return0;elsereturn1;

}intassignvalue(int*dest,intsize)

{if(NULL==dest)return0;while(size>0)

{

scanf("%d",dest);

dest++;

size--;

}return1;

}intsolution(int*source,intvolume,intsize)

{inti,

j;//j用来存储相对栈首地址的便宜量int*stack;//申请的栈空间int*header;

NODE temp;if(NULL==source||0==volume||0==size)return0;if(NULL==(stack=(int*)malloc(size*sizeof(int))))return0;

header=stack;for(i=0;i

{

stack=header;//每一次循环都使栈回到首地址j=0;//每一次循环都使栈的空间使用率为0;temp.i=temp.sum=0;//每一次循环都将使和以及空间计数值变为0;//每次运算需要计算的次数, 第一次循环需要对size个值进行检验//第二次循环则需要对size-i个值进行检验while(temp.i<=size-i)

{

j++;

temp.sum+=*(source+i+temp.i);*stack=*(source+i+temp.i);

stack++;if(temp.sum==volume)//当求出来的和与容积大小相等时就输出{while(j>0)

{

printf("%d",*(stack-1));

j--;

stack--;

}

putchar('\n');//输出完毕就跳出循环,继续对下一轮的数据进行求和}if(temp.sum

temp.i++;continue;

}if(temp.sum>volume)//如果取出来的值加上大于容积,则丢弃,同时将刚压栈的数据出栈{

temp.sum-=*(source+i+temp.i);

temp.i++;*stack=0;

j--;

stack--;continue;

}//end of if}//end of while}//end of forfree(stack);

free(header);return1;

}intmain(intargc,char*argv[])

{intsize;intvolume;int*number;

number=NULL;

printf("input the total number of the package:");

scanf("%d",&size);

printf("\nEnter the elements in the package:\n");if(!getmemory(&number,size)) exit(1);if(!assignvalue(number,size)) exit(1);

puts("\nPlease enter the volum of the package:");

scanf("%d",&volume);if(0==solution(number,volume,size))

exit(1);return0;

}

数据结构背包问题c语言思路,C语言学习趣事_数据结构_经典命题_1_背包问题_分析_1...相关推荐

  1. python的基本数据结构_Python学习笔记——基本数据结构

    列表list List是python的一个内置动态数组对象,它的基本使用方式如下: shoplist = ['apple', 'mango', 'carrot', 'banana'] print 'I ...

  2. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 回溯法

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 回溯法 一.算法思想 二.货箱装载 1.问题描述 2.回溯算法 3.实现 4.测试代码 一.算法思想 回溯法是搜索问题解的一种系 ...

  3. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 优先级队列 — 左高树

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 优先级队列 - 左高树 一.左高树 1.外部节点 2.高度优先左高树 (1)定义 (2)特性 (3)HBLT 与 大小根树 3. ...

  4. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 竞赛树

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 竞赛树 一.赢者树 二.二叉树的数组描述(补充) 1.声明 2.实现 三.赢者树 1.抽象数据类型 2.赢者树的表示 3.声明 ...

  5. C语言学习趣事_之_大数运算_加法

    C语言学习趣事_大数运算_之加法 1.引子    在C语言中,因为预定义的自然数类型的大小是有上下限度的,这就决定了在进行数的运算的时候,必然受到限制,同时因为C语言是最接近汇编的一种程序设计语言,并 ...

  6. GO语言的进阶之路-Golang高级数据结构定义

    GO语言的进阶之路-Golang高级数据结构定义 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们之前学习过Golang的基本数据类型,字符串和byte,以及rune也有所了解, ...

  7. C语言编程入门新手学习精华:这样学习C语言最有效

    1. C语言已死吗? 本资料描述的是使用C语言的高级技巧,力求将你的C语言能力由"基础"提升为"高级".但是学习态度胜过学习方法,在正式学习之前,有一个问题不吐 ...

  8. 数据结构与算法课程设计——C语言《职员薪资查询系统》

    数据结构与算法课程设计--C语言<职员薪资查询系统> 温馨提示:课设要自己去操作,自己写代码,可以借鉴他人代码,学习思路和一些操作,切不可完全抄袭!!! 总体说明:设计一个职员薪资查询系统 ...

  9. 数据结构课程设计—同学录管理系统(c语言)

    数据结构课程设计-同学录管理系统(c语言) 文章目录 前言 一.需求分析 二.总体设计 三.代码实现 四.代码说明 前言 计算机相关专业在学习数据结构这门课程时会有课程设计,我被分配到的是同学录管理系 ...

最新文章

  1. 如何在CPU上优化GEMM(上)
  2. php 点击删除数据,使用php脚本删除数据
  3. ACCV2020国际细粒度网络图像识别冠军方案解读、经验总结
  4. 计算机态,(计算机)有限态自动机,FSM(finite state machine),音标,读音,翻译,英文例句,英语词典...
  5. Intellij Idea: Thymeleaf 命名空间th报错
  6. 论文笔记:语音情感识别(二)声谱图+CRNN
  7. Abaqus帮助文档翻译——菜单栏构成
  8. unicode什么意思中文_请问Unicode中文,日文,韩文,西欧语言等的编码区间是什么?...
  9. php程序员工具箱 v,php工具箱下载_php工具箱 v1.0官方版_魅蓝下载
  10. 联想硬盘保护系统安装
  11. 误差理论与数据处理(一)
  12. 银河麒麟v10_银河麒麟:V10究竟哪里好?开箱测评,瞬间明了!
  13. c语言程序设计第六章习题答案,C语言程序设计(第2版) 刘克威,张凌晓著 习题答案-第六章...
  14. C程序设计 谭浩强 第九章
  15. 不是不给你,而是你承受不住
  16. 路由器分出ITV与网络信号资料
  17. 下雪了堆雪人去 下雪特效
  18. android 微信 功能,安卓版微信悄悄更新,这项功能彻底消失!
  19. Verilog的always块内的常见问题:边沿电平、同步异步、阻塞非阻塞
  20. mysqldump数据备份

热门文章

  1. 图卷积神经网络GCN---递归GCN代表作
  2. 全球最厉害的14位程序员是谁?我们来膜拜下这些大神都有哪些?
  3. python tokenize怎么用_使用python nltk.tokenize时,如何将包含stopwords的短语视为单个标记?...
  4. 学生python编程--学习列表绘制彩虹
  5. 大学四年,总结一套适合小白的Java自学路线和方法
  6. 小甲鱼python课程学习_部分
  7. 树莓派 | 串口01 - 在系统上修改串口的映射关系
  8. 如何创建一个Python Pandas的DataFrame变量,如何给一个DataFrame对象添加新的一行数据?
  9. QT中QSS的使用记录
  10. 冒泡排序及C语言代码