結果
| 問題 | No.15 カタログショッピング | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2025-05-31 16:50:11 | 
| 言語 | D (dmd 2.109.1) | 
| 結果 | 
                                TLE
                                 
                             | 
| 実行時間 | - | 
| コード長 | 1,058 bytes | 
| コンパイル時間 | 5,671 ms | 
| コンパイル使用メモリ | 207,244 KB | 
| 実行使用メモリ | 12,780 KB | 
| 最終ジャッジ日時 | 2025-05-31 16:50:23 | 
| 合計ジャッジ時間 | 12,292 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 5 TLE * 1 -- * 4 | 
ソースコード
module main;
// https://yang33-kassa.jp/yukicoder/yukicoder015/ より
import std;
void main()
{
	// 入力
	long N, S;
	readln.chomp.formattedRead("%d %d", N, S);
	auto A = new long[](N);
	foreach (ref a; A)
		a = readln.chomp.to!long;
	// 答えの計算(半分全列挙、ビットDP)
	alias P = Tuple!(long, long);
	P[] V;
	long n1 = N / 2;
	foreach (i; 0 .. 1L << n1) {
		long sum = 0, bit = 0;
		foreach (j; 0 .. n1) {
			if (i & (1L << j)) {
				sum += A[j];
				bit += 1L << (N - j);
			}
		}
		V ~= P(sum, bit);
	}
	V.sort;
	long n2 = N - n1;
	long[] ans;
	foreach (i; 0 .. 1L << n2) {
		long sum = 0, bit = 0;
		foreach (j; 0 .. n2) {
			if (i & (1 << j)) {
				sum += A[n1 + j];
				bit += 1L << (N - n1 - j);
			}
		}
		foreach (v; V.filter!(a => a[0] == S - sum)) {
			if (v[0] + sum == S)
				ans ~= v[1] | bit;
		}
	}
	// 答えの出力
	ans.sort!"a > b";
	foreach (a; ans) {
		bool ok = false;
		foreach (k; 0 .. N) {
			if (a & (1L << (N - k))) {
				if (ok) write(" ");
				ok = true;
				write(k + 1);
			}
		}
		if (ok) writeln();
	}
}
            
            
            
        