結果

提出番号 1382
提出者 square1001
言語 C++
提出日時 2018-08-02 10:45:54
問題名 (66)Cut onion
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 2ms 8128KB
2 AC 100% 1ms 7504KB
3 AC 100% 2ms 7968KB
4 AC 100% 2ms 8656KB
5 AC 100% 2ms 8416KB
6 AC 100% 2ms 8432KB
7 AC 100% 100ms 8672KB
8 AC 100% 3ms 8080KB
9 AC 100% 2ms 7808KB
10 AC 100% 23ms 8448KB
11 AC 100% 1034ms 7632KB
12 AC 100% 1036ms 8256KB
13 AC 100% 701ms 7632KB
14 AC 100% 1326ms 7968KB
15 AC 100% 817ms 8080KB
16 AC 100% 951ms 7824KB
17 AC 100% 1122ms 8096KB
18 AC 100% 813ms 7792KB
19 AC 100% 851ms 7808KB
20 AC 100% 907ms 8080KB

ソースコード

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const int inf = 1012345678;
int main() {
	int N, K, B;
	cin >> N >> K >> B;
	vector<int> A(N);
	for (int i = 0; i < N; ++i) {
		cin >> A[i];
	}
	vector<int> s(1 << N);
	for (int i = 0; i < 1 << N; ++i) {
		for (int j = 0; j < N; ++j) {
			if ((i >> j) & 1) s[i] += A[j];
		}
		s[i] = (s[i] + B - 1) / B;
	}
	vector<int> dp(1 << N, inf);
	dp[0] = 0;
	for (int i = 0; i <= N; ++i) {
		for (int j = (1 << N) - 1; j >= 0; --j) {
			dp[j] = inf;
			for (int k = j; k > 0; k = (k - 1) & j) {
				dp[j] = min(dp[j], dp[j - k] + s[k]);
			}
		}
		if (dp[(1 << N) - 1] > K) {
			cout << N - i << '\n';
			break;
		}
	}
	return 0;
}