描述
小Hi现在有n个物品,每个物品都有一个价值。并且这n个物品总共有m个不同的属性,每个物品都具有其中若干属性。
小Ho要从中选出若干物品,满足每个属性都正好有奇数个物品拥有,且被选出的物品价值总和最大。你能帮助小Ho完成任务么?
输入
第一行一个数T(<=10),表示数据组数。对于每一组数据:
第一行两个数n,m(1<=n<=1000,m<=10)
接下来每两行描述一件物品。对于每一件物品:
第一行两个数v和s,表示其价值和所含属性数量(v<=100000,s<=m)
第二行s个数,表示该物品拥有的属性编号(1<=编号<=m)
输出
物品价值总和的最大值。
样例输入
1
3 2
2 1
1
2 1
2
5 2
1 2
样例输出
5
分析
(http://www.cnblogs.com/aiterator/p/6623319.html)
明显是背包问题,但是怎样将“多个属性”转为“重量”?
对于每个物品的每个属性,不用管大小,只要考虑奇偶。可以用一个1<<10以内的数表示出这个物品的所有属性。两个物品的属性相加,可以做异或操作。
dp矩阵大小为:物品数*(1<<10)
代码
http://hihocoder.com/contest/offers11/solution/1011929
小Hi现在有n个物品,每个物品都有一个价值。并且这n个物品总共有m个不同的属性,每个物品都具有其中若干属性。
小Ho要从中选出若干物品,满足每个属性都正好有奇数个物品拥有,且被选出的物品价值总和最大。你能帮助小Ho完成任务么?
输入
第一行一个数T(<=10),表示数据组数。对于每一组数据:
第一行两个数n,m(1<=n<=1000,m<=10)
接下来每两行描述一件物品。对于每一件物品:
第一行两个数v和s,表示其价值和所含属性数量(v<=100000,s<=m)
第二行s个数,表示该物品拥有的属性编号(1<=编号<=m)
输出
物品价值总和的最大值。
样例输入
1
3 2
2 1
1
2 1
2
5 2
1 2
样例输出
5
分析
(http://www.cnblogs.com/aiterator/p/6623319.html)
明显是背包问题,但是怎样将“多个属性”转为“重量”?
对于每个物品的每个属性,不用管大小,只要考虑奇偶。可以用一个1<<10以内的数表示出这个物品的所有属性。两个物品的属性相加,可以做异或操作。
dp矩阵大小为:物品数*(1<<10)
代码
http://hihocoder.com/contest/offers11/solution/1011929
本文介绍了一种解决背包问题的新方法,特别关注如何处理具有多个属性的物品选择问题。通过使用位运算来表示物品属性,实现了高效的求解算法。
1万+

被折叠的 条评论
为什么被折叠?



