因为题目要求:“如果有多解,则尽可能让前面的人少抄写。” 所以我先找到分给k个人,最多的人抄写多少,然后再记录g数组,最后递归倒序输出。 但是
#include<bits/stdc++.h>
using namespace std;
int m,k;
int a[505],b[505],c[505];
int dp[505][505];
int g[505][505];
void show(int x,int y)
{
if(g[x][y]==0)
{
cout<<1<<" "<<x<<endl;
return ;
}
show(g[x][y],y-1);
cout<<g[x][y]+1<<" "<<x<<endl;
}
int main()
{
cin>>m>>k;
for(int i=1;i<=m;i++)
{
cin>>a[i];
b[i]=b[i-1]+a[i];
c[i]=max(a[i],c[i-1]);
}
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=k;i++)
{
dp[i][i]=c[i];
g[i][i]=i-1;
}
for(int i=1;i<=m;i++)
{
dp[i][1]=b[i];
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<i&&j<=k;j++)
{
for(int q=1;q<i;q++)
{
if(dp[i][j]>max(dp[q][j-1],b[i]-b[q]))
{
dp[i][j]=max(dp[q][j-1],b[i]-b[q]);
}
}
}
}
int maxx=dp[m][k];
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=k;i++)
{
dp[i][i]=c[i];
g[i][i]=i-1;
}
for(int i=1;i<=m;i++)
{
dp[i][1]=b[i];
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<i&&j<=k;j++)
{
for(int q=i-1;q>=1;q--)
{
if(max(dp[q][j-1],b[i]-b[q])<=maxx)
g[i][j]=q;
if(dp[i][j]>max(dp[q][j-1],b[i]-b[q]))
{
dp[i][j]=max(dp[q][j-1],b[i]-b[q]);
if(g[i][j]==0)
g[i][j]=q;
}
}
}
}
show(m,k);
}