A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

codeforces 687C The Values You Can Make           

题意:

     给n枚硬币,和一个数k。求能够组成总和为k的全部子集的子集能够组成的数字可以是多少。

样例:


输入:3 5025 25 50输出:30 25 50

很普通的dp。

dp[j][y]表示前 i 个硬币是否能够有能够组成总和为j的子集,并且这些子集的子集能组成数字y。

初始条件dp[0][0][0] = 1;

转移方程

第 i 枚硬币的面值为t则

1)dp[j][y] = dp[i-1][j][y] 不使用第 i 枚硬币

2)dp[j][y] |= dp[i-1][j-t][y] 当j >= t 时,使用了i组成j但没有组成y

3)dp[j][y] |= dp[i-1][j-t][y-t] 当y>= t 时,使用i组成j且y。



1 个回复

倒序浏览

很不错,受教了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马