题目链接:
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;
}