【每日一题】求和(好未来笔试题)
1、题目来源
牛客网:求和
2、题目描述
输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来。
3、输入/出描述
输入描述:
每个测试输入包含2个整数,n和m
输出描述:
按每个组合的字典序输出,每行输出一种组合
4、示例
输入:
5 5
输出:
1 4
2 3
5
5、解题思路
这是中兴某年的一道笔试题。其实本质就是0/1背包问题。对于每一个n,我们先考虑是否取n。
-
取n,子问题就变成find(n-1,m-n)
-
不取n,子问题就变成find(n-1,m)
这样就可以把find(n,m)问题拆分成find(n-1,m-n)和find(n-1,m),利用DP的思想找到了递归的递推式。注意这里的终止条件是n<1或者m<1就结束了。
理解:
这里我采用的是flag数组,数组的长度是n,与元素1,2,3 … n一一对应。数组元素表示只有两种情况,1代表选择了对应的数,0代表未选择对应的数。当n>=m时,直接从m=n处开始。就拿n=10,m=8来说,我们可以选择8或不选8,7,6 ……依次类推,直到选择的数相加和为m。