0-1背包相关模版。

2017-02-27  本文已影响0人  Niu_Zi

n种物品,每种物品只有一个。第i种物品的体积为Vi,重量为Wi。选一些物品撞倒一个容量为C的背包,使总体积不超过C时重量尽量大。

代码1:

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]);
            }

答案为d[1][C]。

代码2(用f(i,j)表示“把前i个物品装到容器为j的背包中的最大总重量”):

for (int i = 1; i <= n; i++)
            for (int j = 0; j <= c; j++){
                f[i][j] = (i == n ? 0 : f[i-1][j]);
                if(j >= V[i]) f[i][j] = max(f[i][j],f[i-1][j-V[i]]+W[i]);
            }

代码3(边读边计算):

for (int i = 1; i <= n; i++){
                scanf("%d%d",&V,&W);
            for (int j = 0; j <= c; j++){
                f[i][j] = (i == n ? 0 : f[i-1][j]);
                if(j >= V) f[i][j] = max(f[i][j],f[i-1][j-V]+W);
            }
        }

代码4(滚动数组):

memset(f, 0, sizeof(f));
        for(int i = 1; i <= n; i++){
            scanf("%d%d",&V,&W);
            for (int j = C; j >= 0; j++)
                if(j >=V) f[j] = max(f[j], = f[j - V] + W);
        }
上一篇下一篇

猜你喜欢

热点阅读