結果

問題 No.15 カタログショッピング
ユーザー tnakao0123tnakao0123
提出日時 2016-03-02 16:23:38
言語 C++11
(gcc 11.4.0)
結果
MLE  
実行時間 -
コード長 1,434 bytes
コンパイル時間 807 ms
コンパイル使用メモリ 99,280 KB
実行使用メモリ 814,580 KB
最終ジャッジ日時 2023-10-24 19:32:41
合計ジャッジ時間 4,620 ms
ジャッジサーバーID
(参考情報)
judge15 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,348 KB
testcase_01 AC 1 ms
4,348 KB
testcase_02 AC 3 ms
4,348 KB
testcase_03 AC 9 ms
6,752 KB
testcase_04 AC 2 ms
4,348 KB
testcase_05 MLE -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

/* -*- coding: utf-8 -*-
 *
 * 15.cc: No.15 カタログショッピング - yukicoder
 */

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<deque>
#include<algorithm>
#include<numeric>
#include<utility>
#include<complex>
#include<functional>
 
using namespace std;

/* constant */

const int MAX_N = 31;

/* typedef */

typedef set<int> si;
typedef map<int,si> misi;

/* global variables */

int ps[MAX_N];
misi dp;

/* subroutines */

/* main */

int main() {
  int n, s;
  cin >> n >> s;
  for (int i = 0; i < n; i++) cin >> ps[i];

  dp[0].insert(0);

  for (int i = 0; i < n; i++) {
    //printf("i=%d\n", i);
    int bi = (1 << (n - 1 - i));
    for (misi::reverse_iterator mitj = dp.rbegin(); mitj != dp.rend(); mitj++) {
      int k = mitj->first + ps[i];
      if (k <= s) {
	si &bsj = mitj->second;
	si &bsk = dp[k];
	for (si::iterator sit = bsj.begin(); sit != bsj.end(); sit++)
	  bsk.insert(*sit | bi);
      }
    }
  }

  si &bs = dp[s];

  for (si::reverse_iterator sit = bs.rbegin(); sit != bs.rend(); sit++) {
    const int &bits = *sit;
    bool first = true;
    for (int i = 0, bi = (1 << (n - 1)); i < n; i++, bi >>= 1)
      if (bits & bi) {
	if (! first) putchar(' ');
	first = false;
	printf("%d", i + 1);
      }
    putchar('\n');
  }

  return 0;
}
0