有N件物品和一个容量为V的背包,第i件物品的重量为w[i],价值为v[i],这些物品被划分成了若干组,每组中的物品互相冲突,最多选一件
问将哪些物品放入背包中可以使背包获得最大的价值
对于每一组的物品,都可以看成是一个01背包问题,对每组的物品都处理一遍即可。
输入格式:
第一行:三个整数,V(背包容量,V<=200),N(物品数量,N<=30)和T(最大组号,T<=10);
第2…N+1行:每行三个整数Wi,Vi,p,表示每个物品的重量,价值,所属组号。
从这篇博客参考的思路
若是二维数组的表现形式:
- 组数循环
- 物品选择
- 体积循环
// 二维数组:
f[k][j]表示前k组体积为j的最大价值
for(int k=1; k<=T; ++k) //组别
for(int i=1; i<=N; ++i) //物品
for(int j=V; j>=0; j--) //体积
f[k][j] = max(f[k][j], v[k][i]+f[k-1][j-w[k][i]] ); //求组这组最大
其中,f[k-1][j]
指的是前k-1组体积为j的最大价值,因此v[k][i] + f[k-1][j-w[k][i]]
意思是:取当前这组第i个物品 + 前k-1组体积为j-w[k][i](体积就还剩扣掉当前物品的体积的