傻瓜式免费自助建站系统,深圳布吉做网站,做男装海报的素材网站,广西建设网官方网桂建云分组背包分组背包分组背包
Description
有N件物品和一个容量为V的背包。第i件物品的费用是c[i]#xff0c;价值是w[i]。这些物品被划分为若干组#xff0c;每组中的物品互相冲突#xff0c;最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量#…分组背包分组背包分组背包
Description
有N件物品和一个容量为V的背包。第i件物品的费用是c[i]价值是w[i]。这些物品被划分为若干组每组中的物品互相冲突最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量且价值总和最大。
Input
第一行三个整数v(背包容量v200),n物品数量n30)和t最大组号t10;
第2…n1行每行三个整数wi,ci,p表示每个物品的重量、价值、所属组号。
Output
仅一行一个数表示最大总价值。
Sample Input
10 6 3
2 1 1
3 3 1
4 8 2
6 9 2
2 8 3
3 9 3
Sample Output
20
题目大意
有一个背包有他的可承受重量现在有一些房间每个房间只能拿一个物品来放在背包里背包在不超重的情况下价值最大是多少
解题思路
按01背包的方法写再在里面加一个循环用于枚举第几件然后记住枚举重量时要倒着
动态转移方程
f[j]max(f[j],f[j−v[i][k]]a[i][k]);f[j]max(f[j],f[j-v[i][k]]a[i][k]);f[j]max(f[j],f[j−v[i][k]]a[i][k]);
#includecstdio
#includeiostream
using namespace std;
int a[15][30],v[15][30],b[15],f[205],n,t,m,x,y,h;
int main()
{scanf(%d%d%d,m,n,t);for (int i1;in;i){scanf(%d%d%d,x,y,h);v[h][b[h]]x;//b用来存第h个组有多少件物品v为代价a[h][b[h]]y;//a为价值}for (int i1;it;i)//组for (int jm;j0;j--)//重量for (int k1;kb[i];k)//这个组的第几件if (jv[i][k])//判断是否越界f[j]max(f[j],f[j-v[i][k]]a[i][k]);//动态转移方程printf(%d,f[m]);
}