背包问题C语言程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
东莞理工学院C语言课程设计
课程程序设计基础
题目
院系名称计算机学院
班级
学生姓名学号
组员
指导教师
时间
1 问题要求及任务描述
1.1 题目要求
假设有一个能装入总体积为T的背包和n件体积分别为w1 , w2 , … , wn 的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1 +w2 + … + wn=T,要求
找出所有满足上述条件的解。例如:当T=10,各件物品的体积{1,8,4,3,5,
2}时,可找到下列4组解:
(1,4,3,2)
(1,4,5)
(8,2)
(3,5,2)。
1.2 主要任务
在给定物品数量,物品各自体积和背包体积的前提下,找出物体组合后的总体积与背包体积相等的物体组合
2 解决问题的主要思路和方法
2.1 关键问题
如何选择第i件物品:
(1)考虑物品i被选择,这种可能性仅当包含它不会超过方案总重量限制时才是可行的。选中后,继续去考虑其余物品的选择。
(2)考虑物品i不被选择,这种可能性仅当不包含物品i也有可能会找到价值更大的方案的情况。
2.2 拟采用解决问题的方法
可利用回溯法的设计思想来解决背包问题。首先将物品排成一列,然后顺序选取物品装入背包,假设已选取了前i 件物品之后背包还没有装满,则继续选取第i+1件物品,若该件物品"太大"不能装入,则弃之而继续选取下一件,直至背包装满为止。但如果在剩余的物品中找不到合适的物品以填满背包,则说明"刚刚"装入背包的那件物品"不合适",应将它取出"弃之一边",继续再从"它之后"的物品中选取,如此重复,直至求得满足条件的解,或者无解。
2.3 主要算法和处理流程图
1.输入物品总个数
2.依次输入各物品的体积
3.输入背包总体积
4.将物品排成一列,按顺序选取物品装入背包中,当物品太大不能装入时则弃之继续选取下一件,直到背包装满为止,
5.出现在剩余的物品中找不到合适的物品填满背包的情况是说明刚刚装入背包的那件物品不适合,将它取出后继续选取后面的物品。6.重复步骤4和5直至求出满足条件的解或者无解。
3 程序实现
3.1 程序实现时应考虑的问题
1.如果在选择过程中的任何时刻,选择的数据项的总和符合目标重量,工作就完成了。
2.从选择第一个数据项开始。剩余的数据项的加和必须符合背包的目标重量减去第一个数据项的重量;这是一个新的目标重量。
3.逐个地试每种剩余数据顶组合的可能性。但并不需要去试所有的组合,因为只要数据项的和大于目标重量的时候,就停止添加数据项。
4.如果设有组合合适的话,放弃第—个数据项,并且从第二个数据项开始再重复过程。
5.继续从第三个数据项开始,如此下去直到已经试过所有的组合。
3.2 主要源代码及说明
#include
#define size 20
struct stacks //定义一个临时存储空间结构体(栈)
{
int data[size];//数组
int top;//作为结构体标记
}stack;
void main()
{
int w[size];//定义数组
int V;
int k=0;
int i=0;
int j=1;
int number;
int s=0;
printf("\n请输入可供选择装入物品的个数:");
scanf("%d",&number);
printf("\n请输入各件物品的体积:");
for(i=0;i for(i=0;i printf("\n可供选择的物品的总体s=%dn",s); printf("\n请输入背包的总体积:"); scanf("%d",&V); if(V<0||V>s){printf("\n输入背包体积错误");}//判断总体积必须大于0或小于物品总体积printf("\n"); for(i=0;i stack.top=0;//初始化结构体标记为0 do{ while(V>0&&k<=number)//当V大于0并且k小于等于物品个数,则运行下面循环 { if(V>=w[k])//每次循环判断V变量是否还大于每个元素 { stack.data[stack.top]=k; //符合条件的元素标识记录在结构体的数组中 stack.top++; V-=w[k];//每次循环就把V变量减去该次循环元素的体积数 } k++; }//循环结束 if(V==0){//当v变量只等于0时输出结果 printf("第%d个符合条件的解:",j); for(i=0;i {printf("%d ",w[stack.data[i]]);} j++; printf("\n"); } k=stack.data[--stack.top]; stack.data[stack.top]=0; V+=w[k]; k++; }while(!(stack.top==0&&k==number));//当k等于物品个数时候结束整个循环 } 4 测试 4.1 测试结果及分析