01背包【动态规划】

问题 f: 0-1 背包问题(动态规划)

时间限制: 1 Sec  内存限制: 128 MB
提交: 48  解决: 17

题目描述

给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,问如何选择装入背包的物品,使得装入背包的物品的总价值最大?

在选择装入背包的物品时,对每种物品i只能有两种选择,装入或者不装入,不能装入多次,也不能部分装入。

输入

第一行输入物品的个数n。

第二行输入物品的重量序列w。(中间有空格)

第三行输入物品的价值序列v。(中间有空格)

第四行输入背包容量c。

 

输出

第一行输出装入背包的物品。(用0和1表示,中间无空格)

第二行输出最大价值。

样例输入

3
3 4 5
4 5 6
10

样例输出

011
11
#include <iostream>
#include <algorithm>
using namespace std;
int n, c;
int w[101], v[101];
int choose[101];
int value[101][101];
void max() {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= c; j++) {
            if (j < w[i])value[i][j] = value[i - 1][j];
            else value[i][j] = max(value[i - 1][j], value[i - 1][j - w[i]] + v[i]);
        }
    }
}
void find(int x, int y) {
    if (x >= 0) {
        if (value[x - 1][y] == value[x][y]) { 
            choose[x] = 0; 
            find(x-1,y);
        }
        else if ((y - w[x]) >= 0 && value[x][y] == (value[x - 1][y - w[x]] + v[x])) {
            choose[x] = 1;
            find(x - 1, y - w[x]);

        }

    }

}
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++)cin >> w[i];
    for (int i = 1; i <= n; i++)cin >> v[i];
    cin >> c;
    max();
    find(n, c);
    for (int i = 1; i <= n; i++)cout << choose[i];
    cout << endl << value[n][c];
    return 0;
}

 

posted @ 2019-03-09 16:23  大帅本帅  阅读(14)  评论(0)    收藏  举报