背包--基础--01,完全,组合

01背包

有 N 件物品和一个容量为 V的背包。放入第 i件物品花费的费用是 c [ i ],得到的价值是 w [ i ] ,求将哪些物品装入背包可使价值总和最大。

​for (int i = 1; i <= n; i++)
    for (int j = V; j >= c[i]; j--)
        f[j] = max(f[j], f[j - c[i]] + w[i]);

完全背包

有 N 种物品和一个容量为 V的背包,每种物品都有无限件可用。第 i 种物品的费用是 c [ i ] ,价值是 w [ i ]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

for(int i=1;i<=N;++i){

  for(int j=c[i];j<=V;++j){

    f[j] = max(f[j],f[j-c[i]]+w[i]);

  }

}

 

组合背包

有 N 种物品和一个容量为 V 的背包。第 i 种物品最多有 p [ i ] 件可用,每件费用是 c [ i ] ,价值是 w [ i ] 。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
for(int i=1;i<=N;++i){

  for(int j = V;j>=c[i];++j){

    for(int k=1;k<=p[i];++k){

      f[j] = max(f[j],f[j-c[i]*k]+w[i]*k);

    }

  }

}

 

posted @ 2022-03-03 22:07  fengzlj  阅读(31)  评论(0)    收藏  举报