您的位置:首页 > 编程语言 > C语言/C++

动态规划 背包问题 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;        }    }   }
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: