以下是引用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();//打印结果函数 }