美文网首页
0-1背包相关模版。

0-1背包相关模版。

作者: Niu_Zi | 来源:发表于2017-02-27 15:24 被阅读0次

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

    相关文章

      网友评论

          本文标题:0-1背包相关模版。

          本文链接:https://www.haomeiwen.com/subject/ljpzwttx.html