描述
給定幾個較小的數字和一個大數字,要求出這個大數字能否由這幾個較小的數字組合而成,較小的數字可以重複使用,也可以不使用。如果可以組合,要輸出有多少種組合方案;如果不能組合而成,輸出0。
比如給定數字{1,3,5}和數字7,7可以由(1,3,3)(1,1,5)(1,1,1,1,3)和(1,1,1,1,1,1,1)組合而成,一共有4種組合方案。注意(1,3,3)和(3,3,1)是同一種方案。
再比如給定數字{2,3,4}和數字5,只有一種組合方案。
格式
輸入格式
兩行,第一行是3個小數字,這些數字按照從小到大排列,且不會重複,每個數字的值都在[1,m)之間
第二行是要組合的大數字m(m≤100)
輸出格式
一個正整數,表示可以選擇的組合方案。
樣例
輸入樣例
1 3 5
10
輸出樣例
7
限制
時間限制:100 ms
內存限制:16384 KB
類似於硬幣組合問題
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int a[4], n, dp[105];
a[0] = 0;
for (int i=1; i<=3; i++) {
scanf ("%d", &a[i]);
}
scanf("%d", &n);
memset(dp, 0, sizeof(dp));
dp[0]=1;
for(int i=1; i<=3; i++)
for(int j=a[i]; j<=n; j++)
dp[j] += dp[j - a[i]];
printf("%d\n",dp[n]);
return 0;
}