1. 程式人生 > >01揹包問題的變式Openjudge 2985:數字組合

01揹包問題的變式Openjudge 2985:數字組合

2985:數字組合

總時間限制: 
1000ms 
記憶體限制: 
65536kB
描述
有n個正整數,找出其中和為t(t也是正整數)的可能的組合方式。如:
n=5,5個數分別為1,2,3,4,5,t=5;
那麼可能的組合有5=1+4和5=2+3和5=5三種組合方式。
輸入
輸入的第一行是兩個正整數n和t,用空格隔開,其中1<=n<=20,表示正整數的個數,t為要求的和(1<=t<=1000)
接下來的一行是n個正整數,用空格隔開。
輸出
和為t的不同的組合方式的數目。
樣例輸入
5 5
1 2 3 4 5
樣例輸出
3
這道題讓我知道程式設計時的錯誤有時是簡單而可笑的,可笑在於它太簡單了。
我第一次用01揹包問題的解法做就WA了,如下:
#include<cstdio>
int sum,a[1001],b[1001],n,h,max,m;
void camp(int q,int p)
{
	if(q==a[p])
	{
		sum++;
		return;
	}	
	if(q<0||p>n)
		return;
	camp(q-a[p],p+1);
	camp(q,p+1);
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[
i]); } camp(m,1); printf("%d",sum); }
我WA了也找不到原因,直到過了一週我發現函式return時的條件出了問題,應該是q==0時而不是q==a[p],因為我找到了這樣一組資料:
6 5
5 5 5 5 5 5
 正確答案是6,然而程式答案是1,這結局就令人唏噓不已了,ac原來這麼簡單!