【算法】动态规划的用法——01背包问题
2015-11-03 00:36
351 查看
动态规划的用法——01背包问题
用普通的递归方法,对每个物品是否放入背包进行搜索
C++
用记录结果再利用的动态规划的方法,上面用递归的方法有很多重复的计算,效率不高。我们可以记录每一次的计算结果,下次要用时再直接去取,以提高效率
C++
Java
![](http://img.blog.csdn.net/20151103120954236?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
问题主题:著名的01背包问题 |
问题描述: 有n个重量和价值分别为wi、vi的物品,现在要从这些物品中选出总重量不超过W的物品,求所有挑选方案中的价值最大值。 限制条件: 1<=N<=100 1<=wi 、vi<=100 1<=wi<=10000 |
样例: 输入 N=4 W = {2, 1, 3, 2} V = {3, 2, 4, 2} 输出 W = 5(选择0,1,3号) |
【解法一】
解题分析:
程序实现:
C++[cpp] view plaincopy ![]() #include <stdio.h> #include <tchar.h> #include <queue> #include "iostream" using namespace std; const int N = 4; const int W = 5; int weight = {2, 1, 3, 2}; int value = {3, 2, 4, 2}; int solve(int i, int residue) { int result = 0; if(i >= N) return result; if(weight[i] > residue) result = solve(i+1, residue); else { result = max(solve(i+1, residue), solve(i+1, residue-weight[i]) + value[i]); } } int main() { int result = solve(0, W); cout << result << endl; return 0; } |
【解法二】
解题分析:
用记录结果再利用的动态规划的方法,上面用递归的方法有很多重复的计算,效率不高。我们可以记录每一次的计算结果,下次要用时再直接去取,以提高效率
程序实现:
C++[cpp] view plaincopy ![]() #include <stdio.h> #include <tchar.h> #include <queue> #include "iostream" using namespace std; const int N = 4; const int W = 5; int weight = {2, 1, 3, 2}; int value = {3, 2, 4, 2}; int record [W]; void init() { for(int i = 0; i < N; i ++) { for(int j = 0; j < W; j ++) { record[i][j] = -1; } } } int solve(int i, int residue) { if(-1 != record[i][residue]) return record[i][residue]; int result = 0; if(i >= N) return result; if(weight[i] > residue) { record[i + 1][residue] = solve(i+1, residue); } else { result = max(solve(i+1, residue), solve(i+1, residue-weight[i]) + value[i]); } return record[i + 1][residue] = result; } int main() { init(); int result = solve(0, W); cout << result << endl; return 0; } |
[java] view plaincopy ![]() package greed; /** * User: luoweifu * Date: 14-1-21 * Time: 下午5:13 */ public class Knapsack { private int maxWeight; private int[][] record; private Stuff[] stuffs; public Knapsack(Stuff[] stuffs, int maxWeight) { this.stuffs = stuffs; this.maxWeight = maxWeight; int n = stuffs.length + 1; int m = maxWeight+1; record = new int [m]; for(int i = 0; i < n; i ++) { for(int j = 0; j < m; j ++) { record[i][j] = -1; } } } public int solve(int i, int residue) { if(record[i][residue] > 0) { return record[i][residue]; } int result; if(i >= stuffs.length) { return 0; } if(stuffs[i].getWeight() > residue) { result = solve(i + 1, residue); } else { result = Math.max(solve(i + 1, residue), solve(i + 1, residue - stuffs[i].getWeight()) + stuffs[i].getValue()); } record[i][residue] = result; return result; } public static void main(String args[]) { Stuff stuffs[] = { new Stuff(2, 3), new Stuff(1, 2), new Stuff(3, 4), new Stuff(2, 2) }; Knapsack knapsack = new Knapsack(stuffs, 5); int result = knapsack.solve(0, 5); System.out.println(result); } } class Stuff{ private int weight; private int value; public Stuff(int weight, int value) { this.weight = weight; this.value = value; } int getWeight() { return weight; } void setWeight(int weight) { this.weight = weight; } int getValue() { return value; } void setValue(int value) { this.value = value; } } 原文链接 |
相关文章推荐
- (ZT)幻方常规解法汇总
- Firefox插件推荐
- 第十周 11.2---11.8
- android studio问题rendering problems no render target selected
- CF#200 div2 E Read Time(binary search)
- Cookie 知识点再整理
- 求最近点问题
- Android studio 启动时出现Android studio was unable to create a local connection in order
- maven用途、核心概念、用法、常用参数和命令、扩展
- OC实用技术 - Block
- iOS数据持久化之归档
- 树状数组详解(处理在线数据,求逆序对)
- a标签href带参数跳转在javascript中问题
- Selenium RC 的工作原理
- Word Properties <?ref:xdo000X?> - BIP Deskotop 11.119.00.0 (32-bit) with Office 2013 (32-bit) on Win 7 64-bit
- apache kafka源代码分析工程搭建(IDEA)
- iOS 9 网络请求
- 浅谈搜索引擎技术原理与架构
- 凌晨,开始博客之路
- Permutation_Subset