ACM入门题(一)

question:

用给定的几种钱币凑成某个钱数,一般而言有多重方式。例如,给定了6中钱币面值为2,5,10,20,50,用来凑15元,可以用5个2元、1个5元,或者3个5元,或者用1个5元、1个10元等,显然,最少需要2个钱币,草能凑成15元

destination:

给定输入若干互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。若凑不了,则输出'impossible'

My code:

def  main():
    input_num= input("input your num:")
    input_num = int(input_num)
    #158
    type_list = input("input your type list:")
    #[2,5,10,20,50,100]
    type_list = sorted(type_list, reverse=True)
    for i in range(len(type_list)):
        type_list[i] = int(type_list[i])
    #-----------------------------------------------1---------------------------------------------------
    if input_num >= type_list[0]:
        num0 = int(input_num/type_list[0])
        res0 = int(input_num%type_list[0])
        # -----------------------------------------------1.2---------------------------------------------------
        if res0 >= type_list[1]:
            num1 = int(res0/type_list[1])
            res1 = int(res0%type_list[1])
            if res1 >= type_list[2]:
                num2 = int(res1/type_list[2])
                res2 = int(res1%type_list[2])
                if res2 >= type_list[3]:
                    num3 = int(res2/type_list[3])
                    res3 = int(res2%type_list[3])
                    if res3 >= type_list[4]:
                        num4 = int(res3/type_list[4])
                        res4 = int(res3%type_list[4])
                        if res4 > 0:
                            return 'impossible'
                        else:
                            return 'least need %d 个 %d; %d 个 %d; %d 个 %d; %d 个 %d; %d 个 %d' % (num0, type_list[0], num1, type_list[1], num2, type_list[2], num3, type_list[3], num4, type_list[4])
                    else:
                        if res3 == 0:
                            return 'least need %d 个 %d; %d 个 %d; %d 个 %d; %d 个 %d' % (num0, type_list[0], num1, type_list[1], num2, type_list[2], num3, type_list[3])
                        else:
                            return 'impossible'
                elif res2 >= type_list[4]:
                    num3 = int(res2 / type_list[4])
                    res3 = int(res2 % type_list[4])
                    if res3 > 0:
                        return 'impossible'
                    else:
                        return 'least need %d 个 %d; %d 个 %d; %d 个 %d; %d 个 %d' % (
                        num0, type_list[0], num1, type_list[1], num2, type_list[2], num3, type_list[4])
                else:
                    if res2 == 0:
                        return 'least need %d 个 %d; %d 个 %d; %d 个 %d' % (
                            num0, type_list[0], num1, type_list[1], num2, type_list[2])
                    else:
                        return 'impossible'
            elif res1 >= type_list[3]:
                num2 = int(res1 / type_list[3])
                res2 = int(res1 % type_list[3])
                if res2 >= type_list[4]:
                    num3 = int(res2 / type_list[4])
                    res3 = int(res2 % type_list[4])
                    if res3 > 0:
                        return 'impossible'
                    else:
                        return 'least need %d 个 %d; %d 个 %d; %d 个 %d; %d 个 %d' % (
                        num0, type_list[0], num1, type_list[1], num2, type_list[3], num3, type_list[4])
                else:
                    if res2 == 0:
                        return 'least need %d 个 %d; %d 个 %d; %d 个 %d' % (
                            num0, type_list[0], num1, type_list[1], num2, type_list[3])
                    else:
                        return 'impossible'
            elif res1 >= type_list[4]:
                num2 = int(res1 / type_list[4])
                res2 = int(res1 % type_list[4])
                if res2 > 0:
                    return 'impossible'
                else:
                    return 'least need %d 个 %d; %d 个 %d; %d 个 %d' % (
                        num0, type_list[0], num1, type_list[1], num2, type_list[4])
            else:
                if res1 == 0:
                    return 'least need %d 个 %d; %d 个 %d' % (
                        num0, type_list[0], num1, type_list[1])
                else:
                    return 'impossible'
        # -----------------------------------------------1.3---------------------------------------------------
        elif res0 >= type_list[2]:
            num1 = int(res0/type_list[2])
            res1 = int(res0%type_list[2])
            if res1 >= type_list[3]:
                num2 = int(res1/type_list[3])
                res2 = int(res1%type_list[3])
                if res2 >= type_list[4]:
                    num3 = int(res2/type_list[4])
                    res3 = int(res2%type_list[4])
                    if res3 > 0:
                        return 'impossible'
                    else:
                        return 'least need %d 个 %d; %d 个 %d; %d 个 %d; %d 个 %d' % (num0, type_list[0], num1, type_list[2], num2, type_list[3], num3, type_list[4])
                else:
                    if res2 == 0:
                        return 'least need %d 个 %d; %d 个 %d; %d 个 %d' % (
                        num0, type_list[0], num1, type_list[2], num2, type_list[3])
                    else:
                        return 'impossible'
            elif res1 >= type_list[4]:
                num2 = int(res1 / type_list[4])
                res2 = int(res1 % type_list[4])
                if res2 > 0:
                    return 'impossible'
                else:
                    return 'least need %d 个 %d; %d 个 %d; %d 个 %d' % (
                    num0, type_list[0], num1, type_list[2], num2, type_list[4])
            else:
                if res1 == 0:
                    return 'least need %d 个 %d; %d 个 %d' % (
                        num0, type_list[0], num1, type_list[2])
                else:
                    return 'impossible'
        # -----------------------------------------------1.3---------------------------------------------------
        elif res0 >= type_list[3]:
            num1 = int(res0 / type_list[3])
            res1 = int(res0 % type_list[3])
            if res1 >= type_list[4]:
                num2 = int(res1 / type_list[4])
                res2 = int(res1 % type_list[4])
                if res2 > 0:
                    return 'impossible'
                else:
                    return 'least need %d 个 %d; %d 个 %d; %d 个 %d' % (num0, type_list[0], num1, type_list[3], num2, type_list[4])
            else:
                if res1 == 0:
                    return 'least need %d 个 %d; %d 个 %d' % (num0, type_list[0], num1, type_list[3])
                else:
                    return 'impossible'
        # -----------------------------------------------1.4---------------------------------------------------
        elif res0 >= type_list[4]:
            num1 = int(res0 / type_list[4])
            res1 = int(res0 % type_list[4])
            if res1 > 0:
                return 'impossible'
            else:
                return 'least need %d 个 %d; %d 个 %d' % (num0, type_list[0], num1, type_list[4])
        # -----------------------------------------------1.5---------------------------------------------------
        else:
            if res0 == 0:
                return 'least need %d 个 %d' % (num0, type_list[0])
            else:
                return 'impossible'

    # -----------------------------------------------2---------------------------------------------------
    elif input_num >= type_list[1]:
        num0 = int(input_num/type_list[1])
        res0 = int(input_num%type_list[1])
        if res0 >= type_list[2]:
            num1 = int(res0/type_list[2])
            res1 = int(res0%type_list[2])
            if res1 >= type_list[3]:
                num2 = int(res1/type_list[3])
                res2 = int(res1%type_list[3])
                if res2 >= type_list[4]:
                    num3 = int(res2/type_list[4])
                    res3 = int(res2%type_list[4])
                    if res3 > 0:
                        return 'impossible'
                    else:
                        return 'least need %d 个 %d; %d 个 %d; %d 个 %d; %d 个 %d' % (num0, type_list[1], num1, type_list[2], num2, type_list[3], num3, type_list[4])
                else:
                    if res2 == 0:
                        return 'least need %d 个 %d; %d 个 %d; %d 个 %d' % (
                        num0, type_list[1], num1, type_list[2], num2, type_list[3])
                    else:
                        return 'impossible'
            elif res1 > type_list[4]:
                num2 = int(res1 / type_list[4])
                res2 = int(res1 % type_list[4])
                if res2 > 0:
                    return 'impossible'
                else:
                    return 'least need %d 个 %d; %d 个 %d; %d 个 %d' % (
                    num0, type_list[1], num1, type_list[2], num2, type_list[4])
            else:
                if res1 == 0:
                    return 'least need %d 个 %d; %d 个 %d' % (
                        num0, type_list[1], num1, type_list[2])
                else:
                    return 'impossible'
        elif res0 >= type_list[3]:
            num1 = int(res0 / type_list[3])
            res1 = int(res0 % type_list[3])
            if res1 >= type_list[4]:
                num2 = int(res1 / type_list[4])
                res2 = int(res1 % type_list[4])
                if res2 > 0:
                    return 'impossible'
                else:
                    return 'least need %d 个 %d; %d 个 %d; %d 个 %d' % (
                    num0, type_list[1], num1, type_list[3], num2, type_list[4])
            else:
                if res1 == 0:
                    return 'least need %d 个 %d; %d 个 %d' % (
                    num0, type_list[1], num1, type_list[3])
                else:
                    return 'impossible'
        elif res0 >= type_list[4]:
            num1 = int(res0 / type_list[4])
            res1 = int(res0 % type_list[4])
            if res1 > 0:
                return 'impossible'
            else:
                return 'least need %d 个 %d; %d 个 %d' % (
                    num0, type_list[1], num1, type_list[4])
        else:
            if res0 == 0:
                return 'least need %d 个 %d' % (
                    num0, type_list[1])
            else:
                return 'impossible'

    # -----------------------------------------------3---------------------------------------------------
    elif input_num >= type_list[2]:
        num0 = int(input_num / type_list[2])
        res0 = int(input_num % type_list[2])
        if res0 >= type_list[3]:
            num1 = int(res0 / type_list[3])
            res1 = int(res0 % type_list[3])
            if res1 >= type_list[4]:
                num2 = int(res1 / type_list[4])
                res2 = int(res1 % type_list[4])
                if res2 > 0:
                    return 'impossible'
                else:
                    return 'least need %d 个 %d; %d 个 %d; %d 个 %d' % (num0, type_list[2], num1, type_list[3], num2, type_list[4])
            else:
                if res1 == 0:
                    return 'least need %d 个 %d; %d 个 %d' % (num0, type_list[2], num1, type_list[3])
                else:
                    return 'impossible'
        elif res0 >= type_list[4]:
            num1 = int(res0 / type_list[4])
            res1 = int(res0 % type_list[4])
            if res1 > 0:
                return 'impossible'
            else:
                return 'least need %d 个 %d; %d 个 %d' % (
                num0, type_list[2], num1, type_list[4])
        else:
            if res0 == 0:
                return 'least need %d 个 %d' % (
                num0, type_list[2])
            else:
                return 'impossible'

    # -----------------------------------------------3---------------------------------------------------
    elif input_num >= type_list[3]:
        num0 = int(input_num / type_list[3])
        res0 = int(input_num % type_list[3])
        if res0 >= type_list[4]:
            num1 = int(res0 / type_list[4])
            res1 = int(res0 % type_list[4])
            if res1 > 0:
                return 'impossible'
            else:
                return 'least need %d 个 %d; %d 个 %d' % (num0, type_list[3], num1, type_list[4])
        else:
            if res0 == 0:
                return 'least need %d 个 %d' % (num0, type_list[3])
            else:
                return 'impossible'

    # -----------------------------------------------4---------------------------------------------------
    elif input_num >= type_list[4]:
        num0 = int(input_num / type_list[4])
        res0 = int(input_num % type_list[4])
        if res0 > 0:
            return 'impossible'
        else:
            res = num0
            return 'least need %d 个 %d' % (res, type_list[4])

    # -----------------------------------------------5---------------------------------------------------
    else:
        return 'impossible'


if __name__ == '__main__':
    result = main()
    print(result)

input & output:

get:

1.从input输入的数据类型为str,要先做转int处理

2.一开始直接在对最后数据type_list[4]与上一步余数进行判断,else则为零,未考虑到已经被数组上一位整除的情况,导致输出为Impossible;后在每一次对type_list[4]与上一步余数进行判断后的else中再次对上一步余数进行是否为零的判断,再输出即可

note:

1.本程序默认输入为长度为5的数组,对于输入为10元以上的纸币尚且没想到可行的方法(若载输入时每种面值钱币间增加空格,则在转换成int数据时报错,求大神指导)

猜你喜欢

转载自blog.csdn.net/weixin_40896352/article/details/81262321
今日推荐