动态规划 背包问题 C++

来源:互联网 发布:mac book需要wpa2密码 编辑:程序博客网 时间:2024/05/20 04:15

//  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;}


0 0
原创粉丝点击