01揹包問題的變式Openjudge 2985:數字組合
阿新 • • 發佈:2019-01-27
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了,如下:
-
我WA了也找不到原因,直到過了一週我發現函式return時的條件出了問題,應該是q==0時而不是q==a[p],因為我找到了這樣一組資料:#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[
-
6 5
-
5 5 5 5 5 5
-
正確答案是6,然而程式答案是1,這結局就令人唏噓不已了,ac原來這麼簡單!