【动态规划1】最小砝码问题

问题描述:现有一个天平,只能在天平的一侧放置砝码,输入一个参数N,求最少需要几个砝码才能表示出[1,n]的重量,每个砝码只能用一次。

【解析】二进制的表示问题
 

二进制的表示
数值|权重421
0000
1001
2010
3011
4100
5101
6110
7111


        如上所示,只用2^0,2^1,2^2就可以表示出[0,2^3-1]之间的数字,数字为1表示需要该权重,数值为0表示不需要该权重。所以可以只用log_2^N取上界个砝码就可以表示[1,N]。

平衡三进制

        从左到右,每位的权重为3^1,3^2,3^3,...以此类推,但是每位上的数字从0,1,2变为-1,0,1.所以原来N位数字能表示3^N-1个数字,现在只能表示(3^N-1)/2个数字了。
        物理意义:当前位为0表示不加上该位的权重,为1表示加上该位的权重,为0表示减去该位的权重。

例如:1ZZ表示1*(-1)+3*(-1)+9*1=5

问题描述:你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意小于等于N的正整数重量,那么这套砝码最少需要包含多少个砝码?注意砝码可以放在天平两边。

【解析】使用平衡三进制,N位平衡三进制数字能表示连续的(3^N-1)/2个数字(正数)

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int num = scan.nextInt();
        int sum = 0;
        int i = 0;
        while(sum<num) {
          i++;
          sum = (int)((Math.pow(3,i) - 1)/2);
        }
        System.out.print(i);
        scan.close();
    }
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值