直接當作弱化版的背包做就好了,開個int array維護當前可以湊出的數字,每次加入一個數,複雜度
#include <iostream>
using std::cin;
using std::cout;
int able[1000000 + 1], arr[25 + 1];
int main(){
int n, k, s;
std::cin >> n >> k >> s;
able[0] = 1;
for(int i = 0;i < n;i++) {
int x;
std::cin >> x;
for(int j=s-x;j>=0;j--) {
if(able[j] > 0) {
able[j + x] += able[j];
}
}
}
cout << able[s] << '\n';
return 0;
}其實n這麼小,直接枚舉所有情況就好了,複雜度
#include <iostream>
int arr[25 + 1];
int main(){
long long s;
int n, k, ans = 0;
std::cin >> n >> k >> s;
for(int i = 0; i < n; i++)
std::cin >> arr[i];
int bound = (1 << n);
for(int i = 0; i < bound; i++){
long long sum = 0;
for(int j = 0; j < n; j++){
if(i & (1 << j)){
sum += arr[j];
if(sum > s) break;
}
}
if(sum == s) ans++;
}
std::cout << ans << '\n';
return 0;
}