【问题】

在狄更斯时代,商人们用砝码和天平来称量商品的重量,假设你仅仅有几个砝码,就仅仅能精确地称出一定的重量。比如,假定仅仅有两个砝码:各自是1kg和3kg。

仅仅用1kg的砝码能够称出1kg重量的商品,仅仅用3kg的砝码能够称出3kg重量的商品。

1kg和3kg的砝码放在天平同一边能够称出4kg重量的商品,放在不同边能够称出2kg重量的商品。

因此利用这两个砝码。我们能够称出重量分别为1、2、3、4kg的商品。

编写一个递归函数:

bool IsMeasurable(int target, int weights[], int nWeights)

用来确定用一组给定的砝码是否能称量指定的重量。

可用的砝码用数组weights表示,nWeights表示砝码的个数。

比如前面所讲的两个砝码的演示样例能够使用例如以下的变量表示:

static int sampleWeights[] = {1, 3};

static int nSampleWeights = 2;

给定之后,调用函数:

IsMeasurable(2, sampleWeights, nSampleWeights)

将返回TRUE。由于1kg和3kg的两个砝码可以称出2kg重量的商品。

假设调用函数:

IsMeasurable(5, sampleWeights, nSampleWeights)

将返回FALSE, 由于不能用重1kg和3kg的砝码称5kg的商品。

【分析】

对这个问题最主要的考虑是能按下面方式中的不论什么一种使用每个砝码:

1. 能把它放在天平上与商品不同的一边

2. 能把它放在天平上与商品同样的一边

3. 能把它移离天平

假设选定砝码组中的一个砝码,并知道怎样使用这三个选项中之中的一个来处理后面的问题,那么就能提出解决问题所需的递归思想。

【代码】

#include <stdio.h>
#include <stdlib.h> typedef enum{false, true}bool; bool IsMeasurable(int target, int weights[], int nWeights)
{
if(nWeights == 0)
{
if( 0 == target)
return true;
else
return false;
}else{
bool a, b ,c;
a = IsMeasurable(target, weights, nWeights -1);//将砝码移除
b = IsMeasurable(target + weights[nWeights- 1], weights, nWeights - 1);//将砝码放在商品同一边
c = IsMeasurable(target - weights[nWeights - 1], weights, nWeights - 1);//将砝码放在商品不同边
return (a || b || c);
}
} int main()
{
int sampleWeights[] = {1, 3, 5, 7, 10};
int nSampleWeights = 5;
bool result;
result = IsMeasurable(50, sampleWeights, nSampleWeights);
if(result)
printf("TRUE\n");
else
printf("FALSE\n");
}

C程序设计的抽象思维-递归过程-砝码称重的更多相关文章

  1. 7行代码解决P1441砝码称重(附优化过程)

    先贴上最终代码感受一下: #include <bits/stdc++.h> using namespace std; int i, N, M, wi[21], res = 0; int m ...

  2. 安徽省2016“京胜杯”程序设计大赛_A_砝码称重

    砝码称重 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 61 Accepted: 37 Description 小明非常喜 ...

  3. NOI题库--砝码称重V2(多重背包2^n拆分)

    以前只会写多重背包的原版,渣的不行,为了做此题不得不学习了一下,发现其实也不难,只要理解了方法就好多了(PS:其实和倍增挺像的) 8756:砝码称重V2 总时间限制: 1000ms 内存限制: 655 ...

  4. P2347 砝码称重(动态规划递推,背包,洛谷)

    题目链接:P2347 砝码称重 参考题解:点击进入 纪念我第一道没理解题意的题 ''但不包括一个砝码也不用的情况'',这句话我看成了每个砝码起码放一个 然后就做不出来了 思路: 1.这题数据很小,10 ...

  5. Codevs No.2144 砝码称重2

    2016-05-31 22:01:16 题目链接: 砝码称重2 (Codevs No.2144) 题目大意: 给定N个砝码,求称出M的重量所需砝码最小个数 解法: 贪心 使砝码数量最小,当然是每个砝码 ...

  6. P2347 砝码称重-DP方案数-bitset

    P2347 砝码称重 DP做法 : 转化为 01背包. 进行方案数 更新.最后统计种类. #include<bits/stdc++.h> using namespace std; #def ...

  7. 51nod 1449 砝码称重 (进制思想)

    1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 现在有好多种砝码,他们的重量是 w0,w1,w ...

  8. 51nod 1837 砝码称重【数学,规律】

    题目链接:51nod 1837 砝码称重 小 Q 有 n 个砝码,它们的质量分别为 1 克. 2 克.……. n 克. 他给 i 克的砝码标上了编号 i (i = 1, 2, ..., n),但是编号 ...

  9. P2347 砝码称重

    P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...

随机推荐

  1. nodejs 配置服务自启动

    1安装包 输入以下命令,安装需要的包 npm install node-windows -g 2编写自启动js 在目标server.js目录下新建auto_start_nodejs.js文件,将以下j ...

  2. 【转】SpringMVC Controller 介绍

    转自:原文url 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...

  3. Shell脚本实现非法IP登陆自动报警【转】

    服务器的安全稳定是每个运维都希望达到的目标,毕竟网站一旦流量大了,访问高了,就会有一些无聊人来攻击,帮忙检测漏洞是好,但纯ddos的性质就很恶劣了.说远了,这篇文章只是检测有非法ip登录到服务器上就自 ...

  4. 打包部署到tomcat

    部署到tomcat的方法 注意:在eclipse 或 idea 上需要引入外部tomcat 1.将程序打成war包启动tomcat 2.将target 文件下内容压缩城zip,发布到tomcat RO ...

  5. COM和.NET的互操作

    组件对象模型的基本知识         基于构件的软件开发日益流行,这里我吧自己在学校时整理的关于COM的一些东西献给大家,供初学者参考.一.组件(COM),是微软公司为了计算机工业的软件生产更加符合 ...

  6. 【转】Java JUnit 单元测试小结

    原文链接:https://segmentfault.com/a/1190000006731125 测试类型 单元测试(Unit test) 单元测试关注单一的类. 它们存在的目的是检查这个类中的代码是 ...

  7. 数组用console.log输出

    输出的时候,如果前面有字符串,那么输出的就是整个字符串

  8. HTTPS-HTTPS原理

    楔子 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传输的一些情况,从回复来看,争议还是有的.随着网络越来越普及,应用越来越广 ...

  9. PHP并发操作下的加锁

    最近做后台统计的工具,统计肯定是一个需要运算好久的数据 容许一个用户在一个时间内进行操作,这个时候就需要用到锁了,将这个操作过程锁起来.在用了cache的时候,cache失效可能导致瞬间的多数并发请求 ...

  10. 后缀自动机(SAM)速成手册!

    正好写这个博客和我的某个别的需求重合了...我就来讲一讲SAM啦qwq 后缀自动机,也就是SAM,是一种极其有用的处理字符串的数据结构,可以用于处理几乎任何有关于子串的问题,但以学起来异常困难著称(在 ...