結果

問題 No.286 Modulo Discount Store
ユーザー hotpepsihotpepsi
提出日時 2015-11-01 00:45:07
言語 C++11
(gcc 13.3.0)
結果
AC  
実行時間 6 ms / 2,000 ms
コード長 731 bytes
コンパイル時間 441 ms
コンパイル使用メモリ 57,664 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-09-13 06:40:13
合計ジャッジ時間 1,766 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 40
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <algorithm>
#include <numeric>
#include <cstring>

using namespace std;

int N;
int M[16];
int memo[1 << 15];

int dfs(int b) {
	int &r = memo[b];
	if (r < 0) {
		r = 0;
		int sum = 0;
		for (int i = 0; i < N; ++i) {
			if (b & (1 << i)) {
				sum += M[i];
			}
		}
		for (int i = 0; i < N; ++i) {
			int a = (b & (1 << i));
			if (a) {
				int c = dfs(b ^ a);
				r = max(r, c + min(M[i], (sum - M[i]) % 1000));
			}
		}
	}
	return r;
}

int main(int argc, char *argv[]) {
	cin >> N;
	for (int i = 0; i < N; ++i) {
		cin >> M[i];
	}

	memset(memo, -1, sizeof(memo));
	int discount = dfs((1 << N) - 1);
	int sum = accumulate(M, M + N, 0);
	int ans = sum - discount;
	cout << ans << endl;

	return 0;
}
0