动态规划 背包问题 C++
2017-04-03 16:27
323 查看
// main.cpp// DP程序//这是一个动态规划来解决背包问题的程序//本程序的实例和理论来源博客的链接为 http://blog.csdn.net/mu399/article/details/7722810 //http://blog.csdn.net/dapengbusi/article/details/7463968// 初次编写 by肖邦// Created by Xiao Bang on 2017/4/3.// Copyright © 2017年 Xiao Bang. All rights reserved.//#include <iostream>using namespace std;const int c = 10; //背包的容量void package1(int **f, const int w[], const int v[], const int n) { //注意! new 生成的二维数组做形参时是 **f形式。for (int j = 0; j <= c; j++)if (j < w[n - 1])f[n - 1][j] = 0;else f[n - 1][j] = v[n -1];for (int i = n - 2; i >= 0; i --)for (int j = 0; j <=c;j ++) {if (j < w[i])f[i][j] = f[i + 1][j];elsef[i][j] = f[i + 1][j - w[i]] + v[i] > f[i + 1][j] ?f[i + 1][j - w[i]] + v[i] : f[i + 1][j];}}void answer1(int **f, int x[], const int w[], const int n) { //求背包内放入元素int j = c;for (int i = 0; i < n -1; i ++) {if (f[i][j] == f[i + 1][j])x[i] = 0;else {x[i] = 1;j -= w[i];}x[n -1] = f[n -1][j] ? 1 :0;}}void print(int **f, const int n, const int wf) { //打印生成的表for (int i = 0; i < n; i ++) {for (int j = 0; j <= wf; j ++)cout << f[i][j] << " " ;cout << "\n";}}int main(int argc, const char * argv[]) {int w[] = {2,2,6,5,4}; // 元素的重量int v[] = {6,3,5,4,6}; // 元素的值const int n = sizeof(w) / sizeof(w[0]);int * x = new int();int ** f = new int *;for (int i = 0; i < n; i ++)f[i] = new int [c + 1]();package1(f, w, v, n);answer1(f, x, w, n);print(f,n,c);for (int i = 0; i < n; i ++)if (x[i] == 1)cout << i <<"\t" << w[i] << "\t" << v[i] << "\n";return 0;}#include <iostream>#include <queue>#include <vector>using namespace std;void package(vector<vector<int>> & f, const vector<int> & w, const vector<int> & v) { int n = static_cast<int>(w.size()); int c = static_cast<int>(f[0].size()); for (int i = 0; i < c; i++) { if (i+1 >= w[n-1]) { f[n-1][i] = v[n-1]; } } for (int i = n - 2; i >= 0; i--) { for (int j = 0; j < c; j++) { if (j < w[i]) { f[i][j] = f[i+1][j]; } else { f[i][j] = max(f[i+1][j-w[i]] + v[i], f[i+1][j]); } } }}vector <int> answer(vector<vector<int>> & f, const vector<int> & w, const int c) { int n = static_cast<int>(w.size()); vector<int> x(n, 0); int j = c - 1; for (int i = 0; i < n - 1; i ++) { if (f[i][j] != f[i+1][j]) { x[i] = 1; j -= w[i]; } } x[n-1] = f[n-1][j] == 0? 0 : 1; return x;}int main () { vector<int> w = {2,2,6,5,4}; vector<int> v = {6, 3, 5, 4, 6}; int n = static_cast<int>(w.size()); int c = 10; vector<vector<int>> f(n, vector<int>(c, 0)); package(f, w, v); for (int i = 0; i < n; i++) { for (int j = 0; j < c; j++) { cout << f[i][j] << ' ' ; } cout << endl; } cout << endl; vector <int> result = answer(f, w, c); for (int i = 0; i< n;i ++) { if (result[i] == 1) { cout << i << ' ' << w[i] << ' ' << v[i] << endl; } } }
相关文章推荐
- 动态规划解背包问题/C++/Knapsack problem
- 0-1背包问题动态规划代码实现(C++实现)
- 完全背包问题动态规划c++
- 动态规划解背包问题/C++/Knapsack problem
- 0-1背包问题与动态规划的C/C++代码
- 动态规划解背包问题/C++/Knapsack problem
- 0-1背包问题的动态规划解法
- 开始学习动态规划---先解决下背包问题
- 动态规划 和 背包问题的一个讲座
- 流水线调度最优问题(装配线调度问题)动态规划 O(n)时间(线性时间)C++实现
- 动态规划——背包问题变形
- 0-1背包问题的动态规划解法
- 动态规划的两个经典问题--01背包
- 背包问题与动态规划问题初学
- 0/1背包问题动态规划详解(转)
- 动态规划——背包问题变形 收藏
- 0/1背包问题动态规划详解
- 0-1背包问题的动态规划解法为什么是NPC问题?
- 0-1背包问题;动态规划;时间复杂度O(n方);给出最大价值与解得情况;内有动态规划思路总结;
- 动态规划解0-1背包问题