C++动态规划之背包问题解决方法

2025-05-27 0 100

本文实例讲述了C++动态规划背包问题解决方法。分享给大家供大家参考。具体分析如下:

问题描述:

背包的最大容量为W,有N件物品,每件物品重量为w,价值为p,怎样选择物品能使得背包里的物品价值最大?

输入:
10 3 (W,N)
4 5 (w,p)
6 7 (w,p)
8 9 (w,p)

实现代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55
#include <stdio.h>

#define THING 20

#define WEIGHT 100

int arr[THING][WEIGHT];

/* 背包容量为weight,依次尝试1 - thing 物品时的最大价值 */

int price[100]; /* 物品价格表 */

int weight[100]; /* 物品重量表 */

int main()

{

int i,j;

int max_weight,max_thing;

/* 初始化 */

for(i = 0 ; i < THING ; ++i)

{

for(j = 0 ; j < WEIGHT ; ++j)

arr[i][j] = 0;

}

/* 读入数据 */

scanf("%d%d",&max_weight,&max_thing);

for(i = 1 ; i <= max_thing ; ++i)

{

scanf("%d%d",&weight[i],&price[i]);

}

/* 计算 */

for(i = 1 ; i <= max_thing ; ++i)

{

for(j = 1 ; j <= max_weight ; ++j)

{

if(j >= weight[i])

/* 如果当前物品的容量小于背包容量

(当前物品能放进去) */

{

/* 如果当前物品的价值 + 背包剩余空间能放进去的物品价值

(之间计算过的最佳方案) */

/* 大于上一次选择的价值,则放入当前物品 */

if(price[i] + arr[i - 1][j - weight[i]] > arr[i - 1][j])

arr[i][j] = price[i] + arr[i - 1][j - weight[i]];

else /* 否则继续沿用上次的选择 */

arr[i][j] = arr[i - 1][j];

}

else /* 当前物品放不进去,继续沿用上次的选择 */

arr[i][j] = arr[i - 1][j];

}

}

/* 输出最优解 */

printf("max weight : %d\\n",arr[max_thing][max_weight]);

/* 输出所有子解 arr[][] */

for(i = 0 ; i <= max_thing ; ++i)

{

for(j = 0 ; j <= max_weight ; ++j)

printf("%3d",arr[i][j]);

printf("\\n");

}

return 0;

}

希望本文所述对大家的C++程序设计有所帮助。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 C++动态规划之背包问题解决方法 https://www.kuaiidc.com/75490.html

相关文章

发表评论
暂无评论