砝码问题——分解了三重循环,更优秀的时空复杂度!

题目 砝码数量问题

输入n为物体的重量
现有砝码规格 1 4 6 
问最少需要几个砝码
n的取值范围1<=n<=1000000//几个零记不清了,好像是10亿

最开始的时候用了大量的时间作一个三重嵌套的循环
后来写的过程中发现可能不符合时空复杂度的要求
最后把三重循环分解成了3个,有o(n)平方变成了 a* n

整体的思路:
1.第一个循环的进入条件是i*a<=n;意思是最起码大于6的重量才会用到6这枚砝码
  然后进去之后  如果在循环体中刚好i*a刚好等于重量,就直接goto到最后
  输出i+j+k,而由于初值赋予的都是0,所以结果正确
2.如果循环运行结束都不=n,例如n=11的时候,
这个时候循环结束,i=2,所以给i记--,意为只需要一枚6的砝码
给重量n做减法,n=n-i*a;//这个地方的i是做过--的,因为结束循环的条件是超范围

3.第二个关于砝码4的循环同理上面的

4.第三个关于砝码1的循环,因为任何一个整数都会被1整除,所以循环结束计算结束

5.因为使用了goto,所以在第三重里,计算到最后一步时,直接跳出至结尾
  不需要对k进行--

#include “stdio.h”
/*

*/
int main()
{

int a=6,b=4,c=1;
int i=0,j=0,k=0;
int n;
scanf("%d",&n);

for(i=1;i*a<=n;i++){
    if(a*i==n){
        goto end;
    }
}
i--;
n=n-i*a;

for(j=1;j*b<=n;j++){
    if(j*b==n){
        goto end;
    }
}
j--;
n=n-j*b;

for(k=1;k*c<=n;k++){
    if(k*c==n){
        goto end;
    }
}

end:
printf("%d",i+j+k);

return 0;

}

一眼就看出来怎么做
做了一个多小时,md
主要是前面用了二十多分钟写了个三重循环
写完发现是废的,各种问题
干脆分解开,分步骤解决这个问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值