本文共 1426 字,大约阅读时间需要 4 分钟。
Input : n = 13, k = 3 Output : 2 Explanation : 2 + 3 + 8, 3 + 5 + 5.
code中 k*a[i] >= n 可视为剪枝,此时只有k步,当前最大fibnocci 值为 a[i] 如果k*a[i] < n,那么后面的值之和不可能为当前的n。
code:
#include#define pb(i) push_back(i)using namespace std;int a[40];int tol;int vis[40];void rec(int n,int k,int last){ if(k == 0){ if(n == 0){ ++tol; for(int i = 0; i < 40; ++i){ if(vis[i]){ for(int j = 0; j < vis[i]; ++j) printf("%d ",a[i]); } } printf("\n"); } return; } if(n < 0) return ; for(int i = last; i >= 0 && a[i]*k >= n; --i){ if(a[i] <= n){ ++vis[i]; rec(n-a[i],k-1,i); vis[i] = 0; } }}int main() { int n,k; // 为了防止重复 取起始的2个一 中的一个1 a[0] = 1;a[1] = 2; for(int i = 2; i < 40; ++i){ a[i] = a[i-1] + a[i-2]; } scanf("%d%d",&n,&k); rec(n,k,39); printf("%d\b",tol); return 0; }
转载地址:http://iwsmi.baihongyu.com/