题意就是一个类似斐波那契数列的式子, f[0]=1,f[1]=1,f[i]=f[i-1]+f[i-2]+...+f[i-k],(i>k),否则的话就是f[i]=f[i-1]+f[i-2]+....f[1]+f[0].
考虑到k最小为2时,f[50]=10^10>10^9,所以只要计算存储到前50项即可。
这样之后再利用贪心的思想,优先求最大的,
知道s==0
注意题目要求至少输出两个,不足的话用0补上
#include<iostream>
#define N 50
using namespace std;
long long f[N],ans[N];
int s,k;
int main()
{
cin>>s>>k;
f[0]=f[1]=1;
f[2]=2;
for(int i=3;i<N;i++)
{
if(i>k)
f[i]=2*f[i-1]-f[i-k-1];
else
{
for(int j=i-1;j>=0;j--)
f[i]+=f[j];
}
}
int cnt=0;
for(int i=N-1;i>=0;i--)
{
if(s>=f[i])
{
s-=f[i];
ans[cnt++]=f[i];
}
else if(s==0)
{
if(cnt==1)
{
cout<<2<<endl;
cout<<0;
}
else
cout<<cnt<<endl;
for(int j=0;j<cnt;j++)
cout<<" "<<ans[j];
return 0;
}
}
}