大家知道,整数划分是一道经典的DP题目,但是今天我们要用暴力来解决它!:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int n,m,a[1001],da[1001],b[1001]={0};
long long num,ans;
char s[1001];
int big(){
num=1;
for(int i=1;i<=m;i++){
long long x=0;
for(int j=b[i-1];j<b[i];j++)
x=x*10+a[j];
num*=x;
}
long long x=0;
for(int j=b[m];j<=n;j++)
x=x*10+a[j];
num*=x;
if(num>=ans)return 1;
else return 0;
}
void inser(){
ans=num;
for(int i=1;i<=m;i++){
da[i]=b[i];
}
}
void dfs(int i,int ll){
for(int j=ll+1;j<n;j++){
b[i]=j+1;
if(i<m)dfs(i+1,j);
else if(big())inser();
}
}
int main(){
int i,j,k,t;
scanf("%d\n",&t);
for(i=1;i<=t;i++){
scanf("%s%d",s,&m);
if(i!=t)getchar();
n=strlen(s);
for(j=1;j<=n;j++)
a[j]=s[j-1]-'0';
m--;
dfs(1,0);
printf("%lld\n",ans);
long long x=0;
for(j=1;j<=m;j++){
x=0;
for(k=da[j-1];k<da[j];k++)
x=x*10+a[k];
printf("%lld ",x);
}
x=0;
int kkk0c03;
if(m==0)kkk0c03=1;
else kkk0c03=da[m];
for(int j=kkk0c03;j<=n;j++)
printf("%d",a[j]);
puts("");
ans=0;
}
return 0;
}
静等下一弹