背包算法问题

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

背包问题贪心方法 实验日志
实验题目:
1)求以下情况背包问题的最优解:n=7,M=15,(71,,p p )=(10,5,15,7,6,18,
3)和(71,,w w )=(2,3,5,7,1,4,1)。

实验目的:
1. 掌握贪心方法算法思想;
2. 熟练使用贪心算法之背包问题解决相应的问题。

实验思想:
贪心方法是一种改进了的分级处理方法。

它首先根据题意,选取一种量度标准。

然后按这种量度标准对这n 个输入排序,并按排序一次输入一个量。

如果这个输入和当前已构成在这种量度意义下的部分最优解加在一起不能产生一个可行解,则不把此解输入加到这部分解中。

这种能够得到某种度量意义下的最优解的分级处理方法称为贪心方法。

1.背包问题
(1)背包问题的描述:已知有n 种物品和一个可容纳M 重量的背包,每种物
品i 的重量为i w 。

假定将物品i 的一部分i x 放入背包就会得到i i x p 的效益,这里,10≤≤i x , 0>i p 。

显然,由于背包容量是M ,因此,要求所有选中要装入背包的物品总重量不得超过M.。

如果这n 件物品的总重量不超过M ,则把所有物品装入背包自然获得最大效益。

现需解决的问题是,这些物品重量的和大于M ,该如何装包。

由以上叙述,可将这个问题形式表述如下:
极 大 化
∑≤≤n i i x p 1i
约束条件 M x w n i i ≤∑≤≤1i
n i w p x i i i ≤≤>>≤≤1,0,0,10
(2)用贪心策略求解背包问题
首先需选出最优的量度标准。

不妨先取目标函数作为量度标准,即每装
入一件物品就使背包获得最大可能的效益值增量。

在这种量度标准下的贪心
方法就是按效益值的非增次序将物品一件件放到背包中去。

如果正在考虑中
的物品放不进去,则可只取其一部分来装满背包。

但这最后一次的方法可能
不符合使背包每次获得最大效益增量的量度标准,这可以换一种能获得最大
增量的物品,将它(或它的一部分)放入背包,从而使最后一次装包也符合
量度标准的要求。

算法如下所示。

算法2.1 背包问题的贪心算法
procedure GREEDY-KNAPSACK(P,W,M,X,n)
//P(1:n)和W(1:n)分别含有按P(i)/W(i)≥P(i+1)/ W (i+1)排序的n件物品的效益值和重量。

M是背包的容量大笑,而X(1:
n)是解向量。

//
real P(1:n),W(1:n),X(1:n),M,cu;
integer i,n;
X←0 //将解向量初始化为零
cu←M //cu是背包剩余容量
for i←1 to n do
if W(i)>cu then exit endif
X(i) ←1
cu←cu-W(i)
repeat
if i≤n then X(i) ←cu/W(i)
endif
end GREEDY-KNAPSACK
实验代码:
#include<iostream>
using namespace std;
void beibao(double *w,double *v,double *x,double n,double *C)
{
int i,j,temp;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(v[i]/w[i]<v[j]/w[j])
{
temp=v[i];
v[j]=temp;
temp=w[i];
w[i]=w[j];
w[j]=temp;
}
for(i=0;i<n;i++)
x[i]=0;
for(i=0;*C!=0;i++)
{
i f(w[i]<*C)
{
x[i]=w[i];
*C=*C-w[i];
}
e lse
{
x[i]=*C;
*C=*C-*C;
}
}
}
void main()
{
int i;
double *w,*v,n,C;
double *x;
cout<<"请输入物品数"<<endl;
cin>>n;
w=new double(n);//动态分配内存
v=new double(n);
x=new double(n);
cout<<"请输入背包的容量"<<endl;
cin>>C;
cout<<"请分别输入"<<n<<"个物品的重量:"<<endl; for(i=0;i<n;i++)
cin>>w[i];
cout<<"请分别输入"<<n<<"个物品的价值:"<<endl; for(i=0;i<n;i++)
cin>>v[i];
beibao(w,v,x,n,&C);
cout<<"装入的物品为:"<<endl;
for(i=0;i<n;i++)
{
c out<<"其装的重量为:"<<x[i]<<" 其价值为:"<<v[i];
}
cout<<endl;
}
}
实验结果:
心得体会:
通过本次使用让我了解了什么是贪心法,什么事背包问题以及如何运用背包问题解决问题。

相关文档
最新文档