这是一个比较简单的动态规划,做一点重要提示,程序就不加注释了
题目的意思就是问从1到n总共n个数字中选出一个集合使得集合中数字和为n*(n+1)/4有多少种方法,如果有S种方法,那么输出的答案就是S/2.
我用numberOfWays[i][j]表示1到i中取出一个和为j的集合的方案数,那么就有递推公式
numberOfWays[i][j] = numberOfWays[i-1][j-i] + numberOfWays[i-1][j]
如果n*(n+1)/2是基数,则不能分成两个和相等的集合,输出为0
主要代码运行时间为O(1^2+2^2+3^2+……+n^2) = O(1/6 * n * (2*n +1) * (n+1)) = O(n^3)
numberOfWays[i][0] = 1, 对所有i成立
Code