整数划分 钱币兑换

来源:互联网 发布:同一网络的打印机安装 编辑:程序博客网 时间:2024/04/30 14:08

Problem 36: 自然数拆分


Time Limit:1 Ms| Memory Limit:128 MB
Difficulty:2

Description

输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复。

Input

输入只有一个整数n,表示待拆分的自然数n。 n<=80

Output

输出一个数,即所有方案数

Sample Input

7

Sample Output

14

Hint

解释:
输入7,则7拆分的结果是
7=1+6
7=1+1+5
7=1+1+1+4
7=1+1+1+1+3
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
7=1+1+1+2+2
7=1+1+2+3
7=1+2+4
7=1+2+2+2
7=1+3+3
7=2+5
7=2+2+3
7=3+4
一共有14种情况,所以输出14

#include<stdio.h> int split(int n, int m){    if(n < 1 || m < 1)        return 0;//当或者小于1时,有0种表示方法    if(n == 1 || m == 1)        return 1;//当等于1时,只有一种表示方法    if(n < m)        return split(n, n);//当n小于m时,相当于把n划分成小于等于n的数    if(n == m)        return split(n, m-1)+1;//当n等于m时,比如5,只有5+0和把5划分成小于等于4的数的和    if(n > m)        return split(n, m-1) + split(n-m, m);//当n大于m时,只有两种情况,包含m和不包含m,包含m时,相当于求n-m的划分;不包含时,相当于求最大是m-1的n的划分} int main(void){    int n;    scanf("%d", &n);    printf("%d\n", split(n, n-1));//n拆分成不大于n的数    return 0;}





Problem 45: 钱币兑换问题


Time Limit:1 Ms| Memory Limit:128 MB
Difficulty:2

Description

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

Input

每行只有一个正整数N,N小于32768。(有多组测试数据,以EOF结束)

Output

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

Sample Input

20
2934

Sample Output

44
718831

Source

hdoj
把输入的整数划分为不大于3的情况共有多少种。
用上面的递归方法会超时,所以就用一个数组保存每一步计算的值,
a[i][j]保存把i划分成不大于j的数的和共有多少种情况

#include<stdio.h> int a[32768][4]; void split(int n, int m){    int i, j;    for(i = 1; i <= n; i++)    {        for(j = 1; j <= m; j++)        {            if(i < j)                a[i][j] = a[i][i];            else if(i == j)                a[i][j] = 1 + a[i][j-1];            else                a[i][j] = a[i][j-1] + a[i-j][j];        }    }} int main(void){    int n;    while(scanf("%d", &n) != EOF)    {        split(n, 3);        printf("%d\n", a[n][3]);    }    return 0;}