题目链接

Problem Description

在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。

Input

每行只有一个正整数N,N小于32768。

Output

对应每个输入,输出兑换方法数。

Sample Input

2934
12553

Sample Output

718831
13137761

分析:

这道题应该是一个动态规划的问题,但是也可以转换为数学的问题来解决。

背包代码:

#include<iostream>
#include<stdio.h>
#include<cstdlib>
using namespace std;
int main()
{
    int dp[32770]={0},i,j;
    dp[0]=1;
    for(i=1;i<=3;i++)
        for(j=i;j<32768;j++)
        dp[j]+=dp[j-i];
        int n;
        while(~scanf("%d",&n))
        {
            printf("%d\n",dp[n]);
        }
    return 0;
}

非背包的解法:

#include<iostream>
#include<stdio.h>
#include<cstdlib>
using namespace std;
 int main()
 {
    int n;
    while(~scanf("%d",&n))
    {
        int sum=0,i;
        for(i=0;;i++)
        {
            if(3*i<=n)
            sum=sum+(n-3*i)/2+1;
            else
                break;
        }
        printf("%d\n",sum);
    }
     return 0;
 }
posted on 2017-04-26 08:51  渡……  阅读(317)  评论(0编辑  收藏  举报