受限的組合(完全揹包/動規)

描述

給定幾個較小的數字和一個大數字,要求出這個大數字能否由這幾個較小的數字組合而成,較小的數字可以重複使用,也可以不使用。如果可以組合,要輸出有多少種組合方案;如果不能組合而成,輸出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;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章