// 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];
else
f[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[n]();
int ** f = new int * [n];
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;
}
}
}