(华电科院)算法设计与分析实验报告—01背包问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
}
cout<<"最优解为:"<<endl;
for(i=1;i<=n;i++)
{
cout<<"第"<<i<<"件物品要放:";
cout<<goods[i].X<<endl;
}
}
void main()
{
cout<<"|--------运用贪心法解背包问题---------|"<<endl;
int j,n;
课程设计报告
( 2013 -- 2014 年度第 一 学期)
名称:算法设计与分析
题目0—1背包问题
院系:信息工程
班级:网络11k1
学号:
学生姓名:
指导教师:牛华为
设计周数:1周
成绩:
日期:2013年11月15
一、目的和要求
了解并掌握动态规划算法;
用动态规划算法解决0-1背包问题。
二、实验环境
用VC6.0软件进行编程
}
else
{
goods[i].X=0;
}
for(j=2;j<=n;j++) /*按物品编号做降序排列*/
{
goods[0]=goods[j];
i=j-1;
while (goods[0].flag<goods[i].flag)
{
goods[i+1]=goods[i];
i--;
}
goods[i+1]=goods[0];
四、问题分析
在0/1背包问题中物体或者被装入背包或者不被装入背包只有两种选择。循环变量i、j意义:前i个物品能够装入载重量为j的背包中,数组c意义:c[i][j]表示前i个物品能装入载重量为j的背包中物品的最大价值。若w[i]>j第i个物品不装入背包,否则若w[i]<=j且第i个物品装入背包后的价值>c[i-1][j],则记录当前最大价值,替换为第i个物品装入背包后的价值。
for( i=1;i<=n;i++)
{cin>>v[i];}
knapsack(a,s,v,n,C);
outputsack(a,x,s,C,n);
//max(s,v);
//for( i=1;i<=n;i++)
//cout<<x[i];
cout<<"最大价值是:"<<endl;
cout<<a[n][C]<<endl;
{
for(int k=n;k>=1;k--)
{
if(a[k][C]=a[k-1][C])
x[k]=0;
else
{
x[k]=1;
C=C-s[k];
}
}
x[1]=a[1][C]?1:0;
}
int main()
{
int a[100][100];
int s[100];
int v[100];
int x[100];
{
int j,i;
for(j=2;j<=n;j++)
{
goods[0]=goods[j];
i=j-1;
while (goods[0].p>goods[i].p)
{
goods[i+1]=goods[i];
i--;
}
goods[i+1]=goods[0];
}
} //按物品效益,重量比值做升序排列
void bag(goodinfo goods[],float M,int n)
六、代码如下:
#include <iostream>
using namespace std;
struct goodinfo
{
float p; //物品效益
float w; //物品重量
float X; //物品该放的数量
int flag; //物品编号
};//物品信息结构体
void Insertionsort(goodinfo goods[],int n) //插入排序,按pi/wi价值收益进行排序,一般教材上按冒泡排序
{ goods[i].flag=i;
cout<<"请输入第"<<i<<"件物品的重量:";
cin>>goods[i].w;
cout<<"请输入第"<<i<<"件物品的效益:";
cin>>goods[i].p;
goods[i].p=goods[i].p/goods[i].w;//得出物品的效益,重量比
三、实验内容
0-1背包问题:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中的物品的总价值最大?
在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分物品i。0-1背包问题是一个特殊的整数规划问题。
八、动态规划与贪心算法比较
动态规划法又和贪婪算法有些一样,在动态规划中,可将一个问题的解决方案视为一系列决策的结果。不同的是,在贪婪算法中,每采用一次贪婪准则便做出一个不可撤回的决策,而在动态规划中,还要考察每个最优决策序列中是否包含一个最优子序列。
for(int j=1;j<=C;j++)
{
if(s[i]<=j)
{
if(v[i]+a[i-1][j-s[i]]>a[i-1][j])
a[i][j]=v[i]+a[i-1][j-s[i]];
else
a[i][j]=a[i-1][j];
}
else
a[i][j]=a[i-1][j];
}
}
}
void outputsack(int a[100][100], int x[100],int s[100],int n,int C)
float M;
goodinfo *goods;//定义一个指针
while(j)
{
cout<<"请输入物品的总数量:";
cin>>n;
goods=new struct goodinfo [n+1];//
cout<<"请输入背包的最大容量:";
cin>>M;
cout<<endl;
int i;
for(i=1;i<=n;i++)
问题描述:给定n种物品和一背包。物品i的重量是Wi,其价值为Vi,背包的容量是c,问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。
三、实验条件
用VC6.0软件进行编程。
四、需求分析
对于给定n种物品和一背包。在容量最大值固定的情况下,要求装入的物品价值最大化。
五、基本思想:
总是对当前的问题作最好的选择,也就是局部寻优。最后得到整体最优。总是选择单位价值最高的物品
cout<<endl;
}
Insertionsort(goods,n);
bag(goods,M,n);
cout<<"press <1> to run agian"<<endl;
cout<<"press <0> to exit"<<endl;
cin>>j;
}
}
七、运行结果:
上述结果显示:
贪心算法不是总是最优的.
其c++部分代码如下:
#include<iostream.h>
void knapsack(int a[100][100],int s[100],int v[100],int n,int C)
{
for(int i=0;i<=C;i++)
{
a[0][i]=0;
}
for( i=1;i<=n;i++)
{
a[i][0]=0;
int C,n;
cout<<"请输入物品的总个数n:"<<endl;
cin>>n;
cout<<"请输入背包的总容量C:"<<endl;
cin>>C;
cout<<"请依次输入物品的体积s[i]:"<<endl;
for(int i=1;i<=n;i++)
{cin>>s[i];}
cout<<"请对应输入物品的价值v[i]:"<<endl;
{
float cu; int i,j;
for(i=1;i<=n;i++) goods[i].X=0;
cu=M; //背包剩余容量
for(i=1;i<n;i++)
{ if(goods[i].w<cu) / /若不超过容量,尽量增加物品
{
goods[i].X=1;
cuຫໍສະໝຸດ Baidu=goods[i].w;//确定背包新的剩余容量
return 0;
}
五、调试过程及实验结果
六、总结
01背包问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想,另外,别的类型的背包问题往往也可以转换成01背包问题求解。
实验二:贪心算法解0—1背包问题
一、实验目的
学习掌贪心算法法思想。
二、实验内容
用贪心法求解0—1背包问题,并输出问题的最优解。
相关文档
最新文档