题意:
首先t组数据 (t<=5),一个n代表有n件东西,每个东西可以代表两个物品,商品或者袋子,每个都有个值,如果这个要代表袋子的话,当前就代表是容量,而且必须把其他几件不是袋子的物品放一些进来,容量必须正好装满,问你有多少种合法的方案,袋子中放入的物品不同也代表不同,同一件物品只能放入一个袋子
(n<=15)
Sample Input
331 1 151 1 2 2 3101 2 3 4 5 6 7 8 9 10Sample Output
715127
思路:首先我们看数据范围我们就能想到是状压DP,但是我们不能直接去0 1代表哪些是背包物品,这样我们就不确定物品怎么放入背包,所以我们预处理,我们预处理出所有状态是否可以是一个已经放满的背包,并且枚举状态中哪一个才是背包,为了方便计算
weight[i] 代表 该状态下所有物品的值的和
f[i] 代表该状态下 可以是一个放满的背包的种数
dp[i] 代表 该状态下合法的所有种数
我们可以利用weight 计算出 f[i],即我们枚举到当前位时,我们假设当前位是背包 weight[i]-a[i]==a[i] 如果是的话 f[i]++, 因为当前背包容量是a[i],其他总和也是a[i],即代表当前背包装满了
然后我们可以利用所有的单个装满的背包合并起来算出最后状态
#include#include #include #include #include #include #include #include #include #include #include #include #include