題目描述
當兩種選取方案有一個數字的下標不一樣,我們就認爲是不同的組成方案。
輸入描述:
輸入爲兩行: 第一行爲兩個正整數n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000) 第二行爲n個正整數A[i](32位整數),以空格隔開。
輸出描述:
輸出所求的方案數
輸入
5 15 5 5 10 2 3
輸出
4
#include <bits/stdc++.h>
using namespace std;
int a[1111];
long long dp[1111][1111];
int main(){
int n, sum;
cin >> n >> sum;
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]);
}
dp[0][0] = 1;
for(int i = 1; i <= n; ++i){
for(int j = 0; j <= sum; ++j){
dp[i][j] = dp[i - 1][j];
}
for(int j = a[i]; j <= sum; ++j){
dp[i][j] += dp[i - 1][j - a[i]];
}
}
cout << dp[n][sum] << endl;
}
/*
題意:
給定一個有n個正整數的數組A和一個整數sum,求選擇數組A中部分數字和爲sum的方案數。
當兩種選取方案有一個數字的下標不一樣,我們就認爲是不同的組成方案。
思路:
由於sum比較小,線性dp即可。dp[i][j]表示前i個數和爲j有多少種方案數。討論一下當前數
選不選,轉移一下方程。
*/