三种面额纸币正好付款的O(1)复杂度函数问题-python

现有i张十元纸币,k张五元纸币,j张两元纸币,购物后要支付n元(i,j,k,n 为整数)。要求编写一个复杂度为O(1)的函数find_solution(i,j,k, n),功能是计算出能否用现在手上拥有的纸币是否足够并能刚好拼凑齐n元,而不需要找零。

1、 如果可以,在屏幕输出一个方案并结束: (例子:“需要2张十元纸币,1张五元纸币,张两元纸币,刚好可凑齐27元”)
2. 如果不可以,在屏幕输出“不能刚好凑齐 n元”。

分析:
1.函数复杂度为O(1),此题目目前想到用if判断;
2.纸币面额:10,5,2,总金额n的个位为:0,2,4,5,6,7,8,9是可以支付的;
3.先将5元全部转换为10元:
a = 5j//10
3.1、条件1:n%2==0:
计算个位所需2元数量:m1 = n%10/2
其余2元/5元全部转换为10元:
t1 = (k-m1)2//10
接下来只需 n//10<=i +a+t1,则一定可以支付,进行条件细分:
1). i足够支付:
n//10<=i:
直接支付n//10张10元,0张5元,m1张2元;
2). 需要i+j:
n // 10 > i and (n - 10 * i) // 5 <= j
直接支付i张10元,(t - 10 * i) // 5张5元,m1张2元;
3). 需要i+j +k:
n // 10 > i and (n - 10 * i) // 5 > j
直接支付i张10元,j张5元,m1+(n-10
i-5
j)/2张2元;
3.2、条件2:n%2==1:
计算个位所需2元数量:m2 = (n%10-5)/2
其余2元/5元全部转换为10元:
t2 = (k-m2)*2//10
接下来只需 n//10<=i +a+t2,则一定可以支付,进行条件细分:
1). i足够支付:
n//10<=i:
直接支付n//10张10元,1张5元,m张2元;

2). 需要i+j:
n // 10 > i and (n - 10 * i) // 5 <= j
直接支付i张10元,(t - 10 * i) // 5张5元,m张2元;
3). 需要i+j +k:
n // 10 > i and (n - 10 * i) // 5 > j
直接支付i张10元,j张5元,m2+(n-10i-5j)/2张2元;
完整代码:

def find_solution(i, j, k, n):
    a = 5 * j // 10
    if n % 2 == 0:
        m1 = (n % 10) / 2
        t1 = (k - m1) * 2 // 10
        if n // 10 > i + a + t1:
            print("不能刚好凑齐 n元")
        else:
            if n // 10 <= i:
                print(f"使用{n // 10}张10元,{0}张5元,{m1}张2元,刚好凑齐{n}元")
            else:
                if (n - 10 * i) // 5 <= j:
                    print(f"使用{i}张10元,{(n - 10 * i) // 5}张5元,{m1}张2元,刚好凑齐{n}元")
                else:
                    print(f"使用{i}张10元,{j}张5元,{m1 + (n - 10 * i - 5 * j) / 2}张2元,刚好凑齐{n}元")
    else:
        if n % 10 <5:
            print("不能刚好凑齐 n元")
        else:
            m2 = (n % 10 - 5) / 2
            t2 = (k - m2) * 2 // 10
            if n // 10 > i + a + t2:
                print("不能刚好凑齐 n元")
            else:
                if n // 10 <=i:
                    print(f"使用{n // 10}张10元,{1}张5元,{m2}张2元,刚好凑齐{n}元")
                else:
                    if (n - 10 * i) // 5 <= j:
                        print(f"使用{i}张10元,{(n - 10 * i) // 5}张5元,{m2}张2元,刚好凑齐{n}元")
                    else:
                        print(f"使用{i}张10元,{j}张5元,{m2 + (n - 10 * i - 5 * j) / 2}张2元,刚好凑齐{n}元")

有兴趣的可以试试!

你可能感兴趣的:(if语句)