0-1背包问题

来源:互联网 发布:模拟基金交易软件 编辑:程序博客网 时间:2024/06/18 06:03

问题描述:有n种物品,每种只有一个。第i种物品的体积为Vi,重量为Wi。选一些 物品装到一个容量为C的背包,使得背包内物品在总体积不超过C的前提下重量尽量大。 1≤n≤100,1≤Vi≤C≤10000,1≤Wi≤10 6。

解题方法①:d(i,j)=max(d(i+1,j),d(i+1,j-v[i])+w[i])

d(i,j)的意思是把(i,i+1,i+2,……..n)个物品装到容量为j的背包中的总重量,此时当第i个物品不能放进背包时他的最优解就是由d(i+1,j)决定 当i个物品能够放进背包时他的最优解就是d(i+1,j-v[i])加上i的价值w[i]

同理也可以得到对称状态②: f(i,j)=max(f(i-1,j),f(i-1,j-v[i])+w[i])

状态②代码

#include <iostream>#include <queue>#include <functional>using namespace std;const int maxn = 100;int vis[maxn], d[maxn],f[maxn][maxn];int v[maxn], w[maxn];int n, c;int main(){    int v, w;    cin >> n>>c;    for (int i = 1; i <= n; i++)    {        cin >> v >> w;        for (int j = 0; j <= c; j++)        {            f[i][j] = (i == 1 ? 0 : f[i - 1][j]);            if (j >= v)                f[i][j] = max(f[i][j], f[i - 1][j-v] + w);        }    }    cout << f[n][c] << endl;    system("pause");}

状态①代码

#include <iostream>#include <cstring>#include <string>#include <cstdio>#include <algorithm>#include <set>using namespace std;const int maxn = 100;int v[maxn], w[maxn];int d[maxn][maxn];int main(){    int n, c;    cin >> n >> c;    for (int i = 1; i <= n; i++)        cin >> v[i] >> w[i];    for (int i = n; i >= 1; i--)    {        for (int j = 0; j <= c; j++)        {            d[i][j] = (i == n ? 0 : d[i+1][j]);            if (j >= v[i])            {                d[i][j] = max(d[i][j], d[i + 1][j - v[i]] + w[i]);            }        }    }    cout << d[1][c] << endl;    system("pause");}

也可以将数组变成变成一维的,滚动数组可以减少内存开销,但是打印方案比较困难。
测试数据n=5 ,c=5
v w={(1,5),(2,3),(3,10),(4,9),(5,1)}
这里写图片描述

#include <iostream>#include <queue>#include <functional>#include <algorithm>#include <cstring>using namespace std;const int maxn = 100;int f[maxn];int n, c;int main(){    int v, w;    memset(f,0,sizeof(f));    cin >> n>>c;    for (int i = 1; i <= n; i++)    {        cin >> v >> w;        for(int j=c;j>=0;j--)        {            if(j>=v)                f[j]=max(f[j],f[j-v]+w);        }           }    cout << f[c] << endl;    system("pause");}
原创粉丝点击