0-1背包问题

来源:互联网 发布:方媛的淘宝店 编辑:程序博客网 时间:2024/06/03 20:56

问题描述:
有n个物品,重量分别为w1,w2…wn,价值分别为v1,v2…vn,书包的容量为C。
由于每件物品只能装入或者不装入两种状态,不能重复装入,所以称为0-1背包问题。
求解:如何选择装入的物品使装入的物品的总价值最大。
约束条件:装入书包的物品的重量之和小于书包的容量。

/*int w[N + 1] = {0,2,2,6,5,4};   //测试用例int v[N + 1] = {0,6,3,5,4,6};V[i][j]  表示前i个物品装入容量为j的背包中获得的最大价值,求解的过程就是从顶向下的不断的填充该二维数组,最终求得该问题的解。*/#include<iostream>#include<algorithm>using namespace std;#define  N  5   //物品数量#define  C  10  //书包容量int knapSack(int w[], int v[]){    int V[N + 1][C + 1];    for (int i = 0; i <= N; i++)  V[i][0] = 0;  //初始化第0列    for (int i = 0; i <= C; i++)  V[0][i] = 0;  //初始化第0行    for (int i = 1; i <= N; i++){        for (int j = 1; j <= C; j++)        if (j < w[i]) V[i][j] = V[i - 1][j];      //物品i放不进去时        else  V[i][j] = max(V[i - 1][j], V[i - 1][j - w[i]] + v[i]);  //物品i放进去时    }    //求解装入书包的物品    int x[N + 1];  //为1表示该下标指示的物品装入    int j = C;    x[0] = 0;    for (int i = N; i>0; i--){        if (V[i][j] > V[i - 1][j]) {   //表示将i放进去了            x[i] = 1;             cout<<i<<" ";   //输出放入书包的物品的编号            j = j - w[i];        }        else  x[i] = 0;   //表示i没放进去    }    return V[N][C];     //返回背包取得的最大价值}int main(){    int w[N + 1] = {0,2,2,6,5,4};    int v[N + 1] = {0,6,3,5,4,6};    cout<<endl<<knapSack(w,v);   //输出最大价值    return 0;}
0 0