UVA - 674 Coin Change

本文通过一个具体的示例,展示了如何使用动态规划来解决一种特定的组合问题。通过对重叠子问题特性的利用,虽然代码较为复杂且效率不是最优,但仍然有效地解决了问题。文章还提到了《算法导论》这本书对于理解动态规划的帮助。

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

可以用dp做,但我只利用了重叠子问题这个特点,代码相对复杂,也慢一点。

。。感觉算法导论上dp讲的非常好,看一遍就懂了,刘汝佳的书我之前看了几天都没懂。。。也可能我现在已经有基础了吧

#include<cstdio>
#include<cstring>
#define MAX 8000
using namespace std;

int map[MAX];

int main()
{
    int n,a,b,c,all,temp1,temp2,temp3,help;
    memset(map,-1,MAX*4);
    while(scanf("%d",&n)!=EOF)
    {
        all=0;
        for(a=0;a<=n;a++)
        {
            temp1=a*50;
            if(temp1>=n)
            {
                if(temp1==n&&temp1!=0)
                    all++;
                break;
            }
            for(b=0;b<=n;b++)
            {
                temp2=temp1+b*25;
                if(temp2>=n)
                {
                    if(temp2==n&temp2!=0)
                        all++;
                    break;
                }
                if(map[n-temp2]!=-1)
                {
                    all+=map[n-temp2];
                }
                else
                {
                    help=0;
                    for(c=0;c<=n;c++)
                    {
                        temp3=temp2+c*10;
                        if(temp3>=n)
                        {
                            if(temp3==n)
                                help++;//写错一次
                            break;
                        }
                        help+=(n-temp3)/5+1;
                    }
                    all+=help;
                    map[n-temp2]=help;
                }
            }
        }
        printf("%d\n",all);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值