https://www.luogu.org/problemnew/show/P1021
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a[17],n,k,ans[17],maxn;
int dp(int t,int mx)
{
int f[50000];//f[i] 为拼i所需的最少数的个数
f[0]=0;//边界
for(int i=1;i<=a[t]*n;i++)
f[i]=50000;
for(int i=1;i<=t;i++)
for(int j=a[i];j<=a[t]*n;j++)
f[j]=min(f[j],f[j-a[i]]+1);
for(int i=1;i<=a[t]*n;i++)
if(f[i]>n)
return i-1;
return a[t]*n;
}
void dfs(int t,int mx)
{
if(t==k+1)//所有的邮票数已经全部找完
{
if(mx>maxn)
{
maxn=mx;//最大连续数
for(int i=1;i<=t-1;i++)
ans[i]=a[i];
}
return ;
}
for(int i=a[t-1]+1;i<=mx+1;i++)
{
a[t]=i;
int x=dp(t,mx);//动态规划找此时的最大连续数
dfs(t+1,x);
}
}
int main()
{
cin>>n>>k;
dfs(1,0);
for(int i=1;i<=k;i++)
cout<<ans[i]<<" ";
cout<<endl<<"MAX="<<maxn<<endl;
return 0;
}