题目链接: http://codeforces.com/problemset/problem/837/D
题目大意: 给你一个n, k, 让你从一个大小为n的几个中选出k个数, 是他们乘积的0最多
解题思路: 可以素数分解一下, 两个数0的个数就是min(2的个数, 5的个数), 这样我们就只需要从n个(n2, n5)点对中选取K个, 使他加和最大就可以了, DP
三个状态分别应该是dp(i, j, k)前j个数, 选取了j个, 2的个数为k的最大5的个数, 很像背包了对吧
状态转移方程就是: dp(i, j, k) = max(dp(i-1, j-1, k-n2)+n5, dp(i-1, j, k))
本来需要三维的, 但是第二维肯定是又j-1 ----> j所以滚动数组求解即可
代码:
#include #include #include #include #include #include #include #include #include #include #include
View Code 思考: 遇到一个非常无解的BUG, 循环的时候如果判等于maxm就wa, < 就A, 我就非常非常不解, 然后这道题没有想出来 , 哎, 通过这道题也知道了遇到0的问题就想到素数分解成2, 5
我傻逼啊.........加上等于号数组不就是越界了吗.......