算法导论_实验二 背包问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二背包问题
1.问题描述:
编程实现0-1背包问题,部分背包问题
2.算法原理:
●0-1背包问题
01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2……Wn,与之相对应的价值为P1,P2……Pn。
考虑用动态规划的方法来解决,这里的:
阶段是:在前N件物品中,选取若干件物品放入背包中;
状态是:在前N件物品中,选取若干件物品放入所剩空间为W的背包中的所能获得的最大价值;
决策是:第N件物品放或者不放;
由此可以写出动态转移方程:
我们用f[i,j]表示在前i 件物品中选择若干件放在所剩空间为j 的背包里所能获得的最大价值
f[i, j] = max( f[i-1, j-Wi] + Pi (j >= Wi), f[i-1, j] )
●部分背包问题
给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。
应如何选择装入背包的物品,使得装入背包中物品的总价值最大
选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。
因为每一个物品都可以分割成单位块,单位块的利益越大显然总收益越大,所以它局部最优满足全局最优,可以用贪心法解决。
首先计算每种物品单位重量的价值V/W,然后按单位重量价值从大到小进行排序,根据贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。或将这种物品全部装入背包后,背包内的物品总重量未超过背包容量,则选择单位重量价值次高的物品并尽可能多地装入背包,依此策略一直进行下去,直到背包装满为止。
3.实验数据:
●0-1背包问题
⏹输入:
首先输入两个数m ,n. m表示包最多能承受的重量, n表示有n 个石头. 接下来输入n 行, 每一行两个w, v分别表示一个石头的重量和价值
⏹输出:
输出的值,表示在包的容量有限的前提下, 能装进包中的石头的最大价值
●部分背包问题
⏹输入:
首先输入两个数m ,n. m表示包最多能承受的重量, n表示有n 个石头. 接下来输入n 行, 每一行两个v, w, num分别表示一个石头的重量,价值和数量
⏹输出:
输出的值,表示在包的容量有限的前提下, 能装进包中的石头的最大价值
4.实验截图:
●0-1背包问题
●部分背包问题
5.结果分析:
●0-1背包问题
从图中可以看出, 程序根据f[i, j] = max( f[i-1, j-Wi] + Pi (j >= Wi), f[i-1, j] ) 计算的结果,确实是在包中容量有限的情况下, 最大的价值.
●部分背包问题
从图中可以看出, 程序是先将石头按照它们的单位重量价值排序,然后在按照贪心算法的准则, 优先选择单位重量价值高的石头放到包里.
6.源代码:
●0-1背包问题
#include
using namespace std;
struct Bag
{
int w;
int v;
};
int pack(int m, int n, Bag bags[], int array[][1000])
{
if (n < 0)
{
return 0;
}
if (m < bags[n].w)
{
if (m >= 0)
{
if (array[m][n] == -1)
{
array[m][n] = pack(m, n - 1, bags, array);
return array[m][n];
}
}
return 0;
}
int a = pack(m - bags[n].w, n - 1,bags, array) + bags[n].v;
int b = pack(m, n - 1, bags, array);
array[m][n] = a>b? a: b;
return array[m][n];
}
int main()
{
int m = 0;
int n = 0;
Bag bags[100];
int array[100][1000];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
array[i][j] = -1;
}
cin>>m>>n;
for (int i = 0; i < n; i++)
{
cin>>bags[i].w>>bags[i].v;
}
cout< return 0; } /* 测试数据: 10 3 3 4 4 5 5 6 */ 部分背包问题 #include using namespace std; class Obj { public: int v; // 价值 int w; // 重量 double av; // 平均价值 int num; // 数量 Obj(); Obj(int v, int w, int num); }; Obj::Obj() { } Obj::Obj(int v, int w, int num) { this->v = v;