其他都写得不错 但是算法出了点问题
正确的顺序应该是:排序-最小的两项相加-排序-最小的两项相加-排序-最小的两项相加-排序-最小的两项相加..........
而不是:排序-最小的两项相加-依次往后相加-........
给你一段我写的#include <stdio.h>
#define N 100
int count[N]
int main()
{
int kind,i
double sum=0
void compare(int m)
scanf("%d",&kind)
for(i=0i<kindi++)
scanf("%d",&count[i])
for(i=0i<kind-1i++)
{
compare(kind)
sum+=count[0]+count[1]
count[0]=sum
count[1]=count[kind-1]+1
}
printf("%lf",sum)
return 0
}
void compare(int m)
{
int i,j
for(i=0i<m-1i++)
for(j=ij<m-i-1j++)
if(count[j]>count[j+1])
{
count[j]=count[j]+count[j+1]
count[j+1]=count[j]-count[j+1]
count[j]=count[j]-count[j+1]
}
}
#include<stdio.h>int a[10001],b[10001],h1=1,h2=1,t1=1,t2=0,ans=0,num=0
void qs(int left,int right)
{
if(left>=right) return
int i=left,j=right
a[0]=a[left]
while(i<j)
{
while(a[right]>=a[0]&&i<j) j--
if(i<j)a[i]=a[j]
while(a[left]<=a[0]&&i<j) i++
if(i<j) a[j]=a[i]
}
a[i]=a[0]
qs(left,i-1)
qs(i+1,right)
}
int main()
{
int n
FILE *fp
memset(a,5,sizeof(a))
fp=fopen("fruit.in","r")
fscanf(fp,"%d",&n)
int t,i,j
memset(b,5,sizeof(b))
for(t=1t<=nt++)
fscanf(fp,"%d",&a[t])
qs(1,n)
t1=n
h1+=2
t2++
b[t2]=a[1]+a[2]
ans+=b[t2]
while(++num<n-1)
{
if(a[h1+1]<=b[h2]) {b[++t2]=a[h1]+a[h2]ans+=b[t2]h1+=2}
else if(a[h1]>=b[h2+1]) {b[++t2]=b[h2]+b[h2+1]ans+=b[t2]h2+=2}
else {b[++t2]=a[h1++]+b[h2++]ans+=b[t2]}
}
fp=fopen("fruit.out","w")
fprintf(fp,"%d",ans)
fclose(fp)
return 0
}
这段代码恐怕达不到目的。有如下问题,看注释:for(j=numj>=0j--){ //要改成j>0,因为j从num开始,到1就够数儿了
bubble_sort(a,n)
b[j-1]=a[j-1]+=a[j]//要改成b[j-1]=a[j-2]+=a[j-1],因为j=num开始
n=n-1
}
for(j=numj>=0j--){//改成j=num-1j>0j--。num就越界了,而b[0]还没有赋值,是随机的
total+=b[j]
}
//final=total-temp这句没有必要了
printf("%d",final)//改成printf("%d",total)
}
另:函数bubble_sort改成void型吧,无需返回值,实现中也没有……
以上意见仅供参考……