游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6399|回复: 20

算法帖:砝码

[复制链接]

19

主题

329

帖子

329

积分

中级会员

Rank: 3Rank: 3

积分
329
发表于 2006-7-7 16:40:00 | 显示全部楼层 |阅读模式
算法帖
一个40g重的砝码,掉在地上摔成4块,每块都是整数,且这4块砝码可用来称量1~40g的任何物体。
3星期内有效,前2名奖金50元。任何语言。

3

主题

508

帖子

508

积分

高级会员

Rank: 4

积分
508
发表于 2006-7-7 16:47:00 | 显示全部楼层

Re:算法帖:砝码

和游戏有关吗?

19

主题

329

帖子

329

积分

中级会员

Rank: 3Rank: 3

积分
329
 楼主| 发表于 2006-7-7 16:51:00 | 显示全部楼层

Re:算法帖:砝码

嗯,有点关系,请大家支持。

19

主题

329

帖子

329

积分

中级会员

Rank: 3Rank: 3

积分
329
 楼主| 发表于 2006-7-7 16:55:00 | 显示全部楼层

Re: Re:算法帖:砝码

评委不是我,绝对公平。
我先发,大家写好后跟帖,前2名(程序质量)50元。

sf_200677165432.rar

2.79 KB, 下载次数:

29

主题

354

帖子

359

积分

中级会员

Rank: 3Rank: 3

积分
359
QQ
发表于 2006-7-7 19:08:00 | 显示全部楼层

Re: 算法帖:砝码

Miu: 算法帖:砝码

算法帖
一个40g重的砝码,掉在地上摔成4块,每块都是整数,且这4块砝码可用来称量1~40g的任何物体。
3星期内有效,前2名奖金50元。任何语言。

需要做碰撞效果吗?我是说相互碰撞或掉在地上然后有弹起.最好四块的形状每次都不一样.

3

主题

508

帖子

508

积分

高级会员

Rank: 4

积分
508
发表于 2006-7-7 19:52:00 | 显示全部楼层

Re: 算法帖:砝码

这个程序吗?

sf_200677195223.rar

143.67 KB, 下载次数:

10

主题

95

帖子

95

积分

注册会员

Rank: 2

积分
95
QQ
发表于 2006-7-7 23:09:00 | 显示全部楼层

Re: 算法帖:砝码

5楼的似乎理解错了,一看楼主就是在中学或者大学搞竞赛的同志,用Pascal编控制台程序。我觉得这个程序写的效率是比较低的,而且GOTO太多,也非常难看,比较好的办法是应该先数学证明一定有1
如果没有1, 用3个砝码必然不可能和为39,如果是2边相减得到39,那其中一边总重量必然大于40,所以肯定有一个1
剩下的3个用类似动态规划的方法求解

#include<iostream>
typedef unsigned short WORD;

//*****************************
//用数组和引用两种方式保存四个砝码的重量
//好处在后面的代码中可以看出
WORD Weight[4];
WORD &W1=Weight[0];
WORD &W2=Weight[1];
WORD &W3=Weight[2];
WORD &W4=Weight[3];
//*****************************

//是否能称出这个重量的物品
//Can[w]=true代表可以称出,否则无法称出
bool Can[41];

int main()
{
        //W1=1很容易证明,通过可以称出39来反证
        W1=1;
        //W2最大值为37,此时其它三个砝码都是1
        for (W2=1;W2<=37;W2++)
        {
                //W3最大值为38-W2
                for(W3=1;W3<38-W2;W3++)
                {
                        W4=40-W1-W2-W3;
                        //初始化Can数组
                        memset(Can,0,sizeof(Can));
                        Can[0]=true;
                        Can[1]=true;
                        //遍历第2~4个砝码的重量
                        for(WORD w=1;w<=3;w++)
                        {
                                //这个用来保存Can的一个副本
                                bool CanCopy[41];
                                memcpy(CanCopy,Can,sizeof(Can));
                                for(WORD i=0;i<=40;i++)
                                {
                                        //如果i能称出,那么i加上或减去目前砝码的重量也可以称出
                                        if (CanCopy)
                                        {
                                                Can[Weight[w]+i]=true;
                                                Can[abs(Weight[w]-i)]=true;
                                        }
                                }
                        }
                        //检查是否成功
                        bool Success=true;
                        for(WORD i=1;i<=40;i++)
                        {
                                if(!Can)
                                {
                                        Success=false;
                                        break;
                                }
                        }
                        if (Success)
                        {
                                std::cout<<W1<<" "<<W2<<" "<<W3<<" "<<W4<<std::endl;
                        }
                }
        }
        return 0;
}

10

主题

95

帖子

95

积分

注册会员

Rank: 2

积分
95
QQ
发表于 2006-7-7 23:13:00 | 显示全部楼层

Re:算法帖:砝码

楼主的程序只能求出4组解,我的能求出全排列的6组,而且我的要快得多

10

主题

95

帖子

95

积分

注册会员

Rank: 2

积分
95
QQ
发表于 2006-7-7 23:15:00 | 显示全部楼层

Re:算法帖:砝码

用GetTickCount(似乎精确度不算太高)测速,没有用时间

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2006-7-8 13:01:00 | 显示全部楼层

Re:算法帖:砝码

嗯,终于有研究算法的了。

楼主的题目发的不太清楚和规范,比如求什么就没有明确写出。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 21:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表