| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6686 人关注过本帖
标题:我做了个题目,但是测试过不了,大家看看
取消只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 31楼 Windy0Winll
实在感谢!具体代码你觉得怎么实现?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-22 17:02
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
留下QQ一起讨论

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-22 21:04
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
哦,谢谢,先下来看看

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-24 07:49
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
题目里讲的是归并。  用递归做

[ 本帖最后由 sunyh1999 于 2010-9-24 07:55 编辑 ]

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-24 07:51
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
好啊,你开个群吧!

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-24 16:07
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
本想写了个测试数据,可是遇到错误,各位看看:
图片附件: 游客没有浏览图片的权限,请 登录注册



#include <stdio.h>
#include <stdlib.h>
#define MAXL 400 //定义最大测资为400
int book[MAXL];
int f[MAXL][MAXL];  //f[i][j] (i<=j) 存放i~j合并为一堆的最小力气花费,若i>j,则为-1
FILE *finput,*foutput;
long int strength=0;  //strength为总合并重量
void file_start()
{
    finput=fopen("book.in","r");
    foutput=fopen("book.out","w");
    if(finput==NULL)
        exit(0);
}
void print()//打印结果
{
    fprintf(foutput,"%ld\n",strength);
    system("pause");
}
int sum(int start,int end)        //计算从起点到终点的累加和
{
    int i,s=0;
    for(i=start;i<=end;i++)
    {
        s+= book[i];
    }
    return s;
}
int min_strength(int s, int e)    //求从s开始到e结束合并为一堆的最小力气花费
{
    int k,min=99999999;        //min 存放最小值,初始其为一个很大的数,可以改为int类型的最大数
    if(s==e)                    //起点和终点为一个点
        return 0;
    if(s==e-1)                    //起点和终点相邻
    {
        f[s][e]=sum(s,e);        //写入f数组
        return f[s][e];            //返回
    }
    if(f[s][e] != -1)            //不等于-1表示之前已经计算过!所以直接返回
    {
        return f[s][e];
    }
    for(k=s;k<e;k++)            //以前没有计算过,那么递归计算,找最小值!
    {  
        if( min  >  min_strength(s, k) +  min_strength(k+1, e)  )
            min  =  min_strength(s, k) +  min_strength(k+1, e)  ;
    }
    min = min + sum(s,e);
    f[s][e]=min;
    return min;
}
main()
{
    int n,i,j,w,v=0;//n为有几堆书本
    fscanf(finput,"%d",&n);//输入有几堆书本
    file_start();
    for(i=0;i<n;i++)//输入N堆书
    {
        fscanf(finput,"%d %d",&w,&v);//用户输入数据
        book[i]=w-v;
    }
    for(i=0;i<n;i++)        //f数组所有元素都赋值-1
        for(j=0;j<n;j++)
            f[i][j]=-1;
    for(i=0;i<n;i++)        //对角线元素为0
        f[i][i]=0;
    strength=min_strength(0,n-1);//求最小力气!  
    print();//打印结果函数
    fclose(finput);
    fclose(foutput);
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-24 18:15
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 48楼 jack10141
file_start开始初始文件,fin表示输入,fout表示输出。

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-26 17:48
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
御坂贴个代码。给各位看看。顺便说一下jack10141的代码通过测试了

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-29 19:29
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 61楼 sock258
数据没有问题,jack全部过来

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-10-12 17:35
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 42楼 jack10141
怎么选择书堆中的某一个点合并呢?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-10-12 17:37
快速回复:我做了个题目,但是测试过不了,大家看看
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.081392 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved