結果
| 問題 | No.15 カタログショッピング |
| コンテスト | |
| ユーザー |
izuru_matsuura
|
| 提出日時 | 2016-11-08 18:11:24 |
| 言語 | D (dmd 2.109.1) |
| 結果 |
AC
|
| 実行時間 | 37 ms / 5,000 ms |
| コード長 | 1,436 bytes |
| コンパイル時間 | 1,966 ms |
| コンパイル使用メモリ | 155,264 KB |
| 実行使用メモリ | 8,320 KB |
| 最終ジャッジ日時 | 2024-06-12 04:58:43 |
| 合計ジャッジ時間 | 2,800 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
ソースコード
import std.algorithm;
import std.array;
import std.ascii;
import std.container;
import std.conv;
import std.math;
import std.numeric;
import std.range;
import std.stdio;
import std.string;
import std.typecons;
void log(A...)(A arg) {
stderr.writeln(arg);
}
int size(T)(in T s) {
return cast(int)s.length;
}
void main() {
int N, S; readf("%d %d\n", &N, &S);
auto P = new int[N];
foreach (ref p; P) {
readf("%d\n", &p);
}
int L = N / 2;
int K = N - L;
int[][int] X;
for (int bit = 0; bit < (1<<K); bit++) {
int sum = 0;
foreach (i; 0 .. K) {
if (bit & (1<<i)) {
sum += P[i + L];
}
}
X[sum] ~= bit;
}
int[] f(int bit) {
int[] ret;
foreach (i; 0 .. N) {
if (bit & (1 << i)) {
ret ~= i;
}
}
//stderr.writefln("f : %b %s", bit, ret);
return ret;
}
int[][] ans;
for (int bit = 0; bit < (1<<L); bit++) {
int sum = 0;
foreach (i; 0 .. L) {
if (bit & (1<<i)) {
sum += P[i];
}
}
if (S - sum in X) {
foreach (e; X[S - sum]) {
assert( (bit & (e<<L)) == 0 );
ans ~= f(bit + (e<<L));
}
}
}
ans.sort;
foreach (a; ans) {
writefln("%(%s %)", a.map!"a + 1".array);
}
}
izuru_matsuura