本题思路

/*
首先,假如本题的钱只有12两个面值,那么对应n元人民币,有n/2+1种兑换方法(两元可以有有0、12345……n/2张,一共n/2+1种)
增加5元面值的钱币,则需要在上面思路的基础上,算出5元最多可以换n/5张。循环计算当5元有i张时,剩余n-5*i元人民币,带入上方公式,累加即可。
本算法如果在面值种类多时,需要多重循环。n种面值需要n-2重循环。不确定是否有其他算法能更优化
*/
#include<stdio.h>
int main()
{
    int n,m,p,i,ans;
    scanf("%d",&n);
    m=n/5;
    ans=0;
    for(i=0;i<=m;i++) ans+=(n-5*i)/2+1;
    printf("%d",ans);
}

全部评论
种类较多可以考虑用背包的思路来解,对每种面值跑分组背包。复杂度大概为$O(nm^2)$,$n$为物品种数,$m$为值域。 ```cpp const int maxn = 10000; const int maxm = 510; int n,m; int f[maxm],w[maxn]; int main() { read(n),read(m);//nm^2 for(int i = 1;i<=n;++i) read(w[i]); f[0] = 1; for(int k = 1;k<=n;++k)     for(int i = m;i;--i)         for(int j = i / w[k];j;--j)             f[i] += f[i - j * w[k]]; printf("%d\n",f[m]); return 0; } ```
3
送花
回复
分享
发布于 2020-07-20 21:36

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务