Project Euler Problem 31 (C++和Python)

本文探讨了如何使用递归和动态规划方法计算组成£2硬币的不同方式,提供了C++和Python源代码示例,展示了算法的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem 31 : Coin sums

In England the currency is made up of pound, £, and pence, p, and there are eight coins in general circulation:

1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p).
It is possible to make £2 in the following way:

1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p
How many different ways can £2 be made using any number of coins?

C++ source code

#include <iostream>

using namespace std;

class PE0031
{
public:
    int ways(int target, int avc);
};

int PE0031::ways(int target, int avc)
{
    // eight coin:  1p, 2p, 5p, 10p, 20p, 50p, L1 (100p) and L2 (200p)
    int coins[8] = {1,  2,  5,  10,  20,  50,   100,         200};

    if(avc == 0)
    {
        return 1;
    }
    
    int res = 0;
    while(target >= 0 && avc>0)
    {
        res += ways(target, avc-1);
        target -= coins[avc];
    }
    
    return res;
}

int main()
{
    PE0031 pe0031;

    cout << "L2(200p) can be made using any number of coins different ways ";
    cout << pe0031.ways(200, 7) <<  endl;

    return 0;
}

Python source code

# Recursive method to get all ways      
def ways(target, avc):
    # coins 1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p)
    coins = [1,  2,  5,  10,  20,  50,   100,         200]
    
    if(avc == 0):
        return 1
    
    res = 0
    while target >= 0 and avc > 0:
        res += ways(target, avc-1)
        target -= coins[avc];
    
    return res

# Another recursive method to get all ways
def count(n, m):
    # eight coins: 1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p)
    coins  =  [0,  1,  2,  5,  10,  20,  50,   100,         200]
    if n < 0 or m <= 0: #m < 0 for zero indexed programming languages
        return 0
    
	# needs to be checked after n & m, as if n = 0 and m < 0 then it 
	# would return 1, which should not be the case.
    if n == 0: 
        return 1

    return count(n, m-1) + count(n-coins[m], m)

# Coin Change – Algorithmist http://www.algorithmist.com/index.php/Coin_Change
# Dynamic Programming Solution to the Coin Changing Problem
def getWays(target):    
    # coins 1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p)
    coins = [1,  2,  5,  10,  20,  50,   100,         200]

    Ways = [1] + [0]*target

    for coin in coins:
        for i in range(coin, target+1):
            Ways[i] += Ways[i-coin]

    return Ways[target]

def main():
    print("£2 can be made using any number of coins different ways",ways(200,7))
    print("£2 can be made using any number of coins different ways",getWays(200))
    print("£2 can be made using any number of coins different ways",count(200,8))

if  __name__ == '__main__':
    main()
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值