以下是引用sunyh1999在2010-9-20 20:22:59的发言:
嗯,我估计有可能是要求最优解的算法。还是顺序解法?
嗯,我估计有可能是要求最优解的算法。还是顺序解法?
Ztc不愿意来回走,所以合并只能在相邻的两堆书间进行。书本合并前后,位置不变就这两句就已经限定了要么从头和合并书堆!要么从末尾合并!因为他不愿意来回走!所以我认为应该没最优解!问题的结果在你输入书堆的数据时已经定好了!就是一个循环解题的过程!这就是我的一点见解!不知对否!
程序代码:#include <stdio.h>
#define MAXL 400 //定义最大测资为400
struct book
{
long int w,v;//每一堆的书本都有重量W和价值V
}book[MAXL];
//公式:合并i,j两堆书本所需要的力气为Wi-Vi+Wj-Vj。
long int strength=0,w_count,v_count=0;//strength为总合并重量,w_count为临时的w和变量,v_count为v和的临时变量
void print()//打印结果
{
printf("%ld\n",strength);
}
int current_merger(int i) //判断当前应该首先合并哪两堆,返回两堆中的前一堆编号
{
int j,min_strength=book[0].w-book[0].v+book[1].w-book[1].v;
int t=0;
for(j=1;j<=i;j++)
if(min_strength > book[j].w-book[j].v+book[j+1].w-book[j+1].v)
t=j,min_strength = book[j].w-book[j].v+book[j+1].w-book[j+1].v;
return t;
}
int merge(int t,int end) //合并 t t+1 两堆,并且其后的前移
{
int i;
strength = strength + book[t].w-book[t].v+book[t+1].w-book[t+1].v;
book[t].w+=book[t+1].w;
book[t].v+=book[t+1].v;
for(i=t+1;i<=end;i++)
{
book[i].w = book[i+1].w;
book[i].v = book[i+1].v;
}
return 0;
}
void sorting_book(int n)
{
int i,t;
for(i=n-2;i>=0;i--)//循环n-1次,即合并n-1次,最后变成一堆
{
t=current_merger(i);
merge(t,i);
}
}
main()
{
int n,i;//n为有几堆书本
scanf("%d",&n);//输入有几堆书本
for(i=0;i<n;i++)//输入N堆书
scanf("%d %d",&book[i].w,&book[i].v);//用户输入数据
sorting_book(n);//将数据传入sorting_book中
print();//打印结果函数
}
