算法导论_实验二 背包问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档