0-1背包相关模版。

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);
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容