数据结构与算法分析专题实验-西安交大-赵仲孟

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

西安交通大学

数据结构与算法课程实验

实验名称:数据结构与算法课程专题实验

所属学院:电信学院

专业班级:计算机32班

小组成员:

指导老师:赵仲孟教授

实验一背包问题的求解

1.问题描述

假设有一个能装入总体积为T的背包和n件体积分别为w1,w2,…w n的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1+w2+…+w m=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.问题分析

1、设计基础

后进先出,用到栈结构。

2、分析设计课题的要求,要求编程实现以下功能:

a.从n件物品中挑选若干件恰好装满背包

b. 要求找出所有满足上述条件的解,例如:当T=10,各件物品的体积{1,8,4,

3,5,2}时,可找到下列4组解:(1,4,3,2)、(1,4,5)、(8,2)、(3,5,2)3,要使物品价值最高,即p1*x1+p2*x1+...+pi*xi(其1<=i<=n,x取0或1,取1表示选取物品i) 取得最大值。在该问题中需要决定x1 .. xn的值。假设按i = 1,2,...,n 的次序来确定xi 的值。如果置x1 = 0,则问题转变为相对于其余物品(即物品2,3,.,n),背包容量仍为c 的背包问题。若置x1 = 1,问题就变为关于最大背包容量为c-w1 的问题。现设r={c,c-w1} 为剩余的背包容量。在第一次决策之后,剩下的问题便是考虑背包容量为r 时的决策。不管x1 是0或是1,[x2 ,.,xn ] 必须是第一次决策之后的一个最优方案。也就是说在此问题中,最优决策序列由最优决策子序列组成。这样就满足了动态规划的程序设计条件。

4.问题实现

代码1:

#include"iostream"

using namespace std;

class Link{

public:

int m;

Link *next;

Link(int a=0,Link *b=NULL){

m=a;

next=b;

}

};

class LStack{

private:

Link *top;

int size;

int a[100];

public:

LStack(int sz=0){

top=NULL;

size=0;

a[0]=0;

}

~LStack(){

clear();

}

void clear(){

while(top!=NULL){

Link *temp=top;

top=top->next;

delete temp;

}

size=0;

}

void push(int it, int b){

top=new Link(it,top);

a[size]=b;

size++;

}

int pop(){

int it=top->m;

Link * ltemp=top->next;

delete top;

top=ltemp;

size--;

return it;

}

int topValue(){

return top->m;

}

int length(){

return size;

}

int sum(){

int s=0;

for(int i=0;i

s=s+a[i];

return s;

}

void print(){

for(int i=0;i

cout<

cout<

}

};

void panduan(int x1,int n, int x2[],LStack *x4){ int i,ss=0;

for(i=x4->pop()+1;i

if(x4->sum()+x2[i]<=x1)

{

x4->push(i,x2[i]);

}

if(x4->sum()==x1)

{

x4->print();

break;

}

}

if(x4->length()==1&&x4->topValue()==n-1) return ;

else panduan(x1, n,x2,x4);

}

int main(){

LStack *ll=new LStack(0);

int m[100];

int n,z;

cout<<"输入物品个数"<

cin>>n;

cout<<"输入物品大小"<

for(int i=0;i

cin>>m[i];

cout<<"输入背包大小"<

cin>>z;

ll->push(-1,0);

cout<<"符合条件的解"<

panduan(z,n,m,ll);

return 0;

}

结果1:

相关文档
最新文档