博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DP:0-1背包问题
阅读量:5338 次
发布时间:2019-06-15

本文共 1373 字,大约阅读时间需要 4 分钟。

【问题描述】

0-1背包问题:有 N 个物品,物品 i 的重量为整数 wi >=0,价值为整数 vi >=0,背包所能承受的最大重量为整数 C。如果限定每种物品只能选择0个或1个,求可装的最大价值。
可以用公式表示为:
 【算法思路】

动态规划法。我们可以想到这个问题具有最优子结构性质,假设(x1,x2,...,xn)是最优解,那么在去除x1之后,剩下(x2,...,xn)肯定是以下问题的最优解:

根据这个特征可以设计DP函数并推出递归关系。具体地,m(i,j)是背包容量为j,可选择物品为i,i+1,…,n时0-1背包问题的最优值。由0-1背包问题的最优子结构性质,则:

按着DP[N][C]的矩阵一个一个从 下 往 上 填就可以了,最后的结果是 DP(1,C)。要输出选取的样本编号的时候可以从前往后, DP(1,C)== DP(2,C),则x1=0,否则1,依次类推即可。

【代码】

1 #include
2 #include
3 #include
4 #define MAXN 10000 5 using namespace std; 6 7 int W[MAXN]; 8 int V[MAXN]; 9 int DP[MAXN][MAXN]= {
0};10 11 int knapsack(int C, int N, int W[], int V[], int DP[][MAXN])12 {13 int lackL = min(C, W[N]-1);14 for(int j = 0; j <=lackL; j++) DP[N][j] = 0;15 for(int j = W[N]; j <=C; j++) DP[N][j] = V[N];16 for(int i = N - 1; i>=1; i--){17 lackL = min(C, W[i]-1);18 for(int j = 0; j <=lackL; j++) DP[i][j] = DP[i+1][j];19 for(int j = W[i]; j <=C; j++){20 DP[i][j] = max( DP[i+1][j], DP[i+1][j-W[i]] + V[i] );21 }22 }23 return DP[1][C];24 }25 26 int main()27 {28 int C, N;29 cin >> C >> N;30 for(int i = 1; i <=N; i++) {31 cin >> W[i] >> V[i];32 }33 cout<

 

 【拓展】

如果现在的物品重量weight和背包容量C都是正整数,那么当他们是实数时,如何改进算法满足问题呢?

待完善(算法设计与分析P73)

转载于:https://www.cnblogs.com/JesusAlone/p/7465878.html

你可能感兴趣的文章
无线通信基础(一):无线网络演进
查看>>
如何在工作中快速成长?阿里资深架构师给工程师的10个简单技巧
查看>>
WebSocket 时时双向数据,前后端(聊天室)
查看>>
关于python中带下划线的变量和函数 的意义
查看>>
linux清空日志文件内容 (转)
查看>>
安卓第十三天笔记-服务(Service)
查看>>
Servlet接收JSP参数乱码问题解决办法
查看>>
【bzoj5016】[Snoi2017]一个简单的询问 莫队算法
查看>>
Ajax : load()
查看>>
MySQL-EXPLAIN执行计划Extra解释
查看>>
Zookeeper概述
查看>>
Zookeeper一致性级别
查看>>
Linux远程登录
查看>>
Linux自己安装redis扩展
查看>>
HDU 1016 Prime Ring Problem(dfs)
查看>>
C#中结构体与字节流互相转换
查看>>
session和xsrf
查看>>
跟随大神实现简单的Vue框架
查看>>
Linux目录结构
查看>>
LeetCode-Strobogrammatic Number
查看>>