hdu 1028 回溯法

来源:互联网 发布:淘宝券 编辑:程序博客网 时间:2024/06/08 14:13


解释:
5 = 5
5 = 4 + 1
5 = 3 + 2
5 = 3 + 1 + 1
5 = 2 + 2 + 1
5 = 2 + 1 + 1 + 1
5 = 1 + 1 + 1 + 1 +1
从大数开始以后的每个加数非递增排列
从输入的数开始递归,每次传入的数都比前一个数就可以了,不过for循环需要判断是a 大 还是M-a 大
我最开始就是犯了这个错误
比如5 - 2 =3 则传入下次递归的数是3 ,但实际上 5 = 2 + 2 + 1 ,不能再超过2,所以需要加一个判断 ,如果a < 上一次的b[n],那么 就令k = a
#include<iostream>using namespace std;int b[350];void dfs(int a,int n,int k){if(a < k)k = a;if(a == 0){for(int i = 0 ; i < n ; i ++)cout<<b[i]<<" ";cout<<endl;return;}for(int i = k ; i > 0 ; i --){b[n] = i;k = b[n];dfs(a - i,n + 1,k);}}int main(){int a;cin>>a;dfs(a,0,100000);}