砝码问题

问题描述:
现有1 克、2克、3克、5克、10克、20克的砝码各若干枚,问用这些砝码可以称出多少种不同的重量。
(设砝码总重不超过1000克,且砝码只能放在天平的一端)。
样例:
输入    1 1 0 0 0 0
输出    3
测试数据:
输入        输出
2 2 0 0 0 0 6
1 0 3 0 0 0 7
3 4 0 5 0 0 36
2 2 2 2 2 2 82  

//我的思路
我觉得最基本的想法是求出最大能表示的重量,用一个for循环遍历从一到最大重量,满足的计数器加一...不过这种时间复杂度是O(N)。
晚上躺在床上睡觉前想了一下:
如果只有两种重量的砝码 1g和2g
如果有一个1g的砝码,总共能表达的重量的个数不是最大重量吗?
如果没有一个1g的砝码,总共能表达的重量的个数不是最大值/2?经推理得知能表达的个数为最大重量- (2g - 0g -1)*2g砝码的个数,其中第一个2g表示当前砝码重量,0g表示之前可以和它叠加的重量, 后面的1表示之间的差(常量)...
解释说明:
累加的砝码的重量就是可以从一开始一直连续的重量。
比如说 1g 1个 2g 1个 此时 累加的砝码的重量为3
       1g 1个 3g 1个 此时 累加的砝码的重量为1
       1g 1个 2g 2个  7g 1个  此时 累加的砝码的重量为5
推广得:
如果n个砝码每个砝码都满足  最大重量-(此砝码的重量 - 累加的砝码的重量 -1 )*砝码的个数 ,而且之前如果累加砝码的重量大于此砝码的重量,那么此砝码的重量应该为再加上这个砝码的重量*个数。
这个时间复杂度应该为 常量吧...仅仅的几十步

之后写出的代码为:
#include <iostream.h>
void main()
{
 //定义和初始化变量
 int weight[6] = {1,2,5,6,10,20}; //每个砝码的重量
 int level = 0;      //可以忽略到第几项
 int data[6] = {0,0,0,0,0,0};  //砝码的个数
 int buf = 0;      //累加的范围
 int Max = 0;      //最大能表示的重量
 int num = 0 ;      //不能测出重量的个数
 int buf_num = 0;
//传入数据以及计算一个从一到buf都连续的区间
 cout<<"请输入6个砝码的重量,用空格隔开:";

 for(int i = 0 ;i < 6 ; i++)
 {
 cin>>data[i];
 if(buf > weight[i] - 2)
 {
 buf += weight[i]*data[i];
 level++;
 }
 }
//求出最大能表示的重量
 Max = buf;
 for(i = level ;i < 6 ; i++)
 {
  Max += weight[i]*data[i];
 }
//计算不能表示重量的个数
  for(i = level ;i < 6 ; i++)
 {
  num += (weight[i] - buf -1) *data[i];
  num += buf_num*data[i];
  buf_num += (weight[i] - buf -1);
  buf += data[i]*weight[i];
 }
 cout <<"能表示重量的个数为:"<<Max-num<<endl;
}
 
如有不对的地方希望大家多多指正
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值