codeforces 687C The Values You Can Make
题意:
给n枚硬币,和一个数k。求能够组成总和为k的全部子集的子集能够组成的数字可以是多少。
样例:
输入: 3 50 25 25 50 输出:3 0 25 50
很普通的dp。
dp[i][j][y]表示前 i 个硬币是否能够有能够组成总和为j的子集,并且这些子集的子集能组成数字y。
初始条件dp[0][0][0] = 1;
转移方程
第 i 枚硬币的面值为t则
1)dp[i][j][y] = dp[i-1][j][y] 不使用第 i 枚硬币
2)dp[i][j][y] |= dp[i-1][j-t][y] 当j >= t 时,使用了i组成j但没有组成y
3)dp[i][j][y] |= dp[i-1][j-t][y-t] 当y>= t 时,使用i组成j且y。