完全背包问题的具体方案输出

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N];
int f[N][N],d[N][N],res[N];  //d[i][j] = k记录的是当前第i个物品的在每个j的状态下有k个
int main(){
    cin >> n >>m;
    for(int i = 1; i <= n; i++) cin >>v[i] >>w[i];

    for(int i = 1; i <=n; i++){
        for(int j = 0; j <=m; j++){
            f[i][j] = f[i - 1][j];
            for(int k = 0;k *v[i]<=j; k++){
                if(f[i][j] < f[i-1][j-v[i]*k]+w[i]*k){
                    f[i][j] = f[i-1][j-v[i]*k]+w[i]*k;
                    d[i][j] = k;
                }
            }
        }
    }

    cout << f[n][m]<<endl;
    int tmp = f[n][m];
    int i = n, j = m;
    while(tmp >0 ){
        int k = d[i][j];
        if(k != 0){
            res[i] = k;
            tmp -= k*w[i];
            j -= k*v[i];
            i--;
        }else{
            i--;
        }
    }
    for(int i = 1; i <= n; i++){
        cout<< res[i]<<" ";
    }
    return 0;
}

举个例子:

输入:
3 7
5 4 
3 4
4 5
输出:
9
0 1 1
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务