題目鏈接:
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;
}