//============================================================================
// Name : 18数组分割.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
int a[100];
int f[1000][10];
int path[100][10];
const int MAX=10000;
int n;
void print(int i,int length,int Min)
{
if(i<=0||length<=0)
return;
cout<<"path11["<<i<<"]["<<length<<"]="<<path[i][length]<<endl;
print(f[i][length]-a[path[i][length]],length-1,Min);
cout<<a[path[i][length]]-Min<<" ";
}
void compute_f(int sum,int Min)
{
for(int i=0;i<=n;i++)
{
for(int j=sum;j>=0;j--)
{
f[i][j]=-MAX;
}
}
f[0][0]=0;
for(int i=1;i<=n;i++)
{
for(int j=sum;j>=a[i];j--)
{
for(int k=1;k<=n/2;k++)
{
if(f[j][k]<f[j-a[i]][k-1]+a[i]&&f[j-a[i]][k-1]!=-MAX)
{
f[j][k]=f[j-a[i]][k-1]+a[i];
path[j][k]=i;
//cout<<"path["<<j<<"]["<<k<<"]="<<path[j][k]<<endl;
// cout<<"f["<<j<<"]["<<k<<"]="<<f[j][k]<<endl;
}
}
}
}
cout<<"result"<<endl;
for(int i=1;i<=sum;i++)
{
for(int j=1;j<=n/2;j++)
{
if(f[i][j]!=-MAX)
{
cout<<"f["<<i<<"]["<<j<<"]="<<f[i][j]<<endl;
cout<<"path["<<i<<"]["<<j<<"]="<<path[i][j]<<endl;
}
}
}
print(sum,n/2,Min);
}
int min()
{
int Min=MAX;
for(int i=1;i<=n;i++)
{
if(Min>a[i])
Min=a[i];
}
return Min;
}
int main() {
a[1]=-1;
a[2]=5;
a[3]=7;
a[4]=8;
a[5]=9;
a[6]=6;
a[7]=3;
a[8]=11;
a[9]=20;
a[10]=17;
n=10;
int sum=0;
int Min=min();
cout<<"Min"<<Min<<endl;
if(Min<0)
{
for(int i=1;i<=n;i++)
{
a[i]+=1-Min;
}
Min=1-Min;
}
else Min=0;
for(int i=1;i<=n;i++ )
sum+=a[i];
cout<<sum/2<<endl;
compute_f(sum/2,Min);
return 0;
}
本文介绍了一个使用C++实现的数组分割算法,该算法通过动态规划寻找最优分割方案,使得数组分割后的各部分和尽可能平衡。文章展示了详细的代码实现过程,并通过递归方式打印出最优路径。
2019

被折叠的 条评论
为什么被折叠?



