1. 程式人生 > >OpenJudge-百練-2755

OpenJudge-百練-2755

這道題用遞迴寫的話還是很好寫的,我們設遞迴函式的名稱為Ways(w,k) 。

它的含義就是,w的大小,取k個物品,有多少種方式。

我們可以知道遞迴的邊界條件就是當w的大小為0的時候,我們的方法數只有一種,但是當我們要取0個物品的時候,我們的方法數就為0了,因為Ways(40,0),顯然是0。

邊界條件知道以後,我們就可以知道對於物品k來說,我們有兩種策略,一種是選它,一種是不選,我們把總的方案數加起來就可以了。

所以不選的時候,我們就讓k-1,選的時候我們就讓k-1,然後w-a[k]。

程式如下:

#include <iostream>
using namespace std;
int a[30],N;

int Ways(int w,int k)
{
	if (w==0)
		return 1;
	if (k<=0)
		return 0;
	return Ways(w,k-1)+Ways(w-a[k],k-1);
}

int main()
{
	cin>>N;	
	for (int i=1;i<=N;i++) {
		cin>>a[i];
	}
	cout<<Ways(40,N)<<endl;
	return 0;
}