有n件物品和一个容量为v的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为几组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大.
设f[k][v]表示前k组物品花费费用v能取得的最大价值,则有:
f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]}//i是枚举第k组中的物品
基本代码:
for(int k=1;k<=n;k++)
for(int j=v;j>=0;j--)//枚举钱
for(int i=a[k][1];i<=gs[k];i++) //枚举第k组中的物品
f[v]=max(f[v],f[v-c[a[k][i]]]+w[a[k][i]]);
ps:
枚举物品的循环必须放在内层,这样才能保证每一组内的物品最多只有一个会被添加到背包中。