题目描述
在一个圆形操场的四周摆放着 n堆石子。 现要将石子有次序地合并成一堆。 规定每次选2 堆石子合并成新的一堆,合并的费用为新的一堆石子数。试设计一个算法,计算出将 n堆石子合并成一堆的最小总费用。
输入
输入数据第1行有1个正整数 n(1≤n≤1000),表示有 n堆石子,每次选2堆石子合并。第2行有 n个整数, 分别表示每堆石子的个数(每堆石子的取值范围为[1,1000]) 。
输出
数据输出为一行, 表示对应输入的最小总费用。
样例输入
7
45 13 12 16 9 5 22
样例输出
313
代码
#include<stdio.h>
int n = 0 ;
int main()
{
int arry[20],i=0;
int sumCost(int arry[],int n ) ;
int findMinSum(int arr[]) ;
int cost =0 ;
printf("请输入堆的个数");
scanf("%d",&n) ;
printf("请依次输入每个堆") ;
for(i;i<n;i++)
scanf("%d",&arry[i]) ;
cost = sumCost(arry,n);
printf("最小花费为:%d",cost) ;
}
int sumCost(int arr[],int n)
{
int sum = 0 ;
int x =0;
int costsum = 0 ;
int costArr[20] ;
while(x<n-1)
{
sum+=findMinSum(arr) ;
x++ ;
}
return sum ;
}
int findMinSum(int arr[])
{
int i=0,j=0,min=0,recordi=0;
int minNum[2] ;
int sum = 0 ;
if(n<=2)
{
return arr[0]+arr[1] ;
}else
{
while(j<2)
{
min=100000;
for(i=0;i<n;i++)
{
if(arr[i]<min && arr[i]!=-1)
{ min=arr[i] ;
// printf("-----%d min",arr[i]) ;
minNum[j] = arr[i] ;
recordi = i ;
}
}
j++;
arr[recordi]= -1 ;
}
arr[recordi] = minNum[0]+minNum[1] ;
}
return minNum[0]+minNum[1] ;
}