dp专题

版权声明:大家随意浏览。 https://blog.csdn.net/sinat_30062549/article/details/51816683

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。




猜你喜欢

转载自blog.csdn.net/sinat_30062549/article/details/51816683