动态规划之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 }
本文来自博客园,作者:Arthurian,转载请注明原文链接:https://www.cnblogs.com/Arthurian/p/9079704.html
欢迎邮件交流:zhuanxinxin@aliyun.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
2017-05-30 SQL Server各个版本的区别