https://www.luogu.com.cn/problem/P1021、
思路:暴搜+dp
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3;
#define int long long
int dp[maxn];
int a[30],n,m;
int fun(int k)
{
int d[maxn];
memset(d,0x3f,sizeof(d));
for(int j = 1;j<=k;j++)
d[a[j]] = 1;
for(int i =1;i<maxn;i++)
{
for(int j=1;j<=k;j++)
{
if(i-a[j]>=0&&d[i - a[j]]!=0&&d[i - a[j]]<n)
{
d[i] = min(d[i - a[j]] + 1,d[i]);
}
}
if(d[i] == 4557430888798830399)
return i - 1;
}
}
int MM;
int ans[30];
void solve(int k)
{
if(k == m+1)
{
if(dp[k - 1]>MM)
{
MM= dp[k - 1];
for(int i =1;i<=m;i++)
ans[i] = a[i];
}
return ;
}
int Max = dp[k -1]+1;
for(int i =1;i<=Max ;i++)
{
a[k] = i;
dp[k] = fun(k);
solve(k + 1);
a[k] = 0;
}
}
signed main() {
cin>>n>>m;
dp[1] = n;
a[1] = 1;
solve(2);
for (int i = 1; i <= m; i++)
cout << ans[i] << ' ';
cout<<'\n';
cout<<"MAX="<<MM<<endl;
return 0;
}