贪心0/1背包

贪心0/1背包

 

题目描述

有 一容量为weight的背包。现在要从n件物品中选取若干装入背包中,每件物品i的重量为w[i],价值为p[i]。定义一种可行的背包装载为:背包中物 品的总重量不能超过背包的容量,并且一个物品要么全部选取,要么不选取。定义最佳装载是指所装入的物品价值最高,并且是可行的背包装载。

输入

第1行一个整数,表示背包的重量weight
第2行一个整数,表示n件物品
第3行有n个整数,分别表示n个物品的重量
第4行有n个整数,分别表示n个物品的价值

输出

共两行。第1行n个物品的选取状态,0表示不取,1表示取。n个状态用空格分隔,行尾无空格。第2行表示装入物品的最高价值。

样例输入

11
4
2 4 6 7
6 10 12 13

样例输出

0 1 0 1
23
经典的问题
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1001;
int n, c, MAX;//n:个数, c:容量, MAX:最大价值
int v[maxn], w[maxn], x[maxn], last[maxn];//v 价值 w 重量 x 目前装载 last 最后装载
void slove(int i, int cV, int cW){//i 第i个物品 cV 目前最大价值 cW 目前重量
    if(i >= n){//遍历完成
        if(cV > MAX){//更新
            MAX = cV;
            for(int i = 0; i < n; i++){
                last[i] = x[i];
            }
        }
    }else {
        for(int j = 0; j <=1; j++){//j = 0不装, j = 1 装
            x[i] = j;
            if(cW + w[i]*j <= c){//更新
                cW += w[i]*j;
                cV += v[i]*j;
                slove(i+1, cV, cW);//进行下一位
            }

        }
    }

}
int main(){
    ios::sync_with_stdio(false);
    cin >> c >> n;
    for(int i = 0; i < n; i++){
        cin >> w[i];
    }
    for(int i = 0; i < n; i++){
        cin >> v[i];
    }
    MAX = 0;
    slove(0, 0, 0);
    for(int i = 0; i < n-1; i++){
        cout << last[i] <<" ";
    }
    cout << last[n-1] << endl<< MAX <<endl;
}
View Code

 

posted on 2016-07-19 10:50  disppr  阅读(343)  评论(0编辑  收藏  举报