题目链接:

https://vjudge.net/contest/348156#problem/K

题面:

思路:

这道题目就需要学习一种思路:
他是要求完全背包的分配方案数,和原先学习的完全背包不太一样。
思想就是每次更改一个硬币的面值(当然因此剩余的钱要相应减少),比如4的话:
可以有3种情况:

1,1,1,1
1,1 , ,2
2 ,, ,2
然后你会发现2的话是:
1,1
2
4可以看作是只换成1的方案数 加上 2能换成任意面值的方案数 的总和,因为剩余的两种方案只是在得到2以后加上一张2面值的硬币,所以有如下规律:f(n)=f ( n - v[i] )+f( n );即:n的方案数=n已有的方案数+添加一种新的面值的方案数,这里每次添加的新的面值就一个,所以f(n- v [i] )是等于f(填一个新的面值的硬币)的。

参考代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
int dp[50000];
int main()
{
    int n,i,j;
    while(scanf("%d",&n)!=EOF){
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        for(i=1;i<=3;i++)
        {
            for(j=i;j<=n;j++)
            {
                dp[j]=dp[j]+dp[j-i];
            }
        }
        printf("%d\n",dp[n]);
    }
    return 0;
}