勇者與魔王

Subtask 1

直接當作弱化版的背包做就好了,開個int array維護當前可以湊出的數字,每次加入一個數,複雜度

O(nS)
O(nS)O(nS)
#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;
}

Subtask 2

其實n這麼小,直接枚舉所有情況就好了,複雜度

O(2^n)
O(2n)O(2^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;
}

INFOR OJ

By Tommy Chiang

INFOR OJ

  • 344