随笔 - 223  文章 - 0  评论 - 77  阅读 - 68万

动态规划之0-1背包问题

0-1 背包问题是动态规划中一个典型的问题。

问题描述

给定n种物品和一个背包,物品 i 价值 wi 和重量 vi 已知,确定装入背包的物品方案,使得包内物品总价值最大。

算法过程

设n个物品重量存储在w[n]中,价值存储在数组v[n]中,背包容量位C,数组V[n+1][C+1]存放迭代结果,其中V[i][j]表示前i个物品装入容量为j的背包中获得的最大价值,数组x[n]存储装入背包的物品,动态规划求解过程如下:

代码实现

因为所有数据都是在程序运行后输入的,所以需要动态数组来存储。这里使用指针来实现动态数组。

复制代码
 1 #include <stdio.h>
 2 
 3 int KnapSack(int n,int w[],int v[]);
 4 
 5 int *w, *v, n, C;
 6 
 7 int main()
 8 {
 9     int i;
10     printf_s("请输入背包容量:");
11     scanf_s("%d", &C);
12     printf_s("请输入物品个数:");
13     scanf_s("%d", &n);
14 
15     w = new int [n];
16     printf("请输入物品重量:");
17     for(i = 0; i < n; i++)
18         scanf_s("%d", &w[i]);
19 
20     v = new int [n];
21     printf("请输入物品价值:");
22     for(i = 0; i < n; i++)
23         scanf_s("%d", &v[i]);
24 
25     printf("最优价值:%d", KnapSack(n,w,v));
26     return 0;
27 }
28 
29 
30 int KnapSack(int n,int w[],int v[])
31 {
32     int i,j;
33 
34     int **V = new int*[C+1];
35     for (i = 0; i < C+1; i++)
36         V[i] = new int[n+1];
37 
38     int *x = new int[n];
39     for (i = 0; i <= n; i++)
40         V[i][0] = 0;
41     for (j = 0; j <= C; j++)
42         V[0][j] = 0;
43     for (i = 1; i <= n; i++)
44         for (j = 1; j <= C; j++)
45             if(j < w[i-1])
46                 V[i][j] = V[i-1][j];
47             else
48                 V[i][j] = V[i-1][j] >= (V[i-1][j-w[i-1]]+v[i-1]) ? V[i-1][j]: (V[i-1][j-w[i-1]]+v[i-1]);
49 
50     j = C;
51     for (i = n; i > 0; i--)
52     {
53         if (V[i][j] > V[i-1][j])
54         {
55             x[i-1] = 1;
56             j = j - w[i-1];
57         }
58         else
59             x[i-1] = 0;
60     }
61     return V[n][C];
62 }
复制代码

 

posted on   Arthurian  阅读(726)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2017-05-30 SQL Server各个版本的区别
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

点击右上角即可分享
微信分享提示