結果
| 問題 | No.15 カタログショッピング |
| コンテスト | |
| ユーザー |
tnakao0123
|
| 提出日時 | 2016-03-02 23:11:02 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 47 ms / 5,000 ms |
| コード長 | 2,889 bytes |
| コンパイル時間 | 1,192 ms |
| コンパイル使用メモリ | 103,464 KB |
| 実行使用メモリ | 15,908 KB |
| 最終ジャッジ日時 | 2024-09-24 13:37:44 |
| 合計ジャッジ時間 | 2,016 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
ソースコード
/* -*- 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 vector<int> vi;
typedef map<int,vi> mivi;
typedef pair<int,vi> pivi;
typedef vector<pivi> vpivi;
/* global variables */
int ps[MAX_N];
mivi dp0, dp1;
/* subroutines */
void do_dp(int n, int s, int i0, int i1, mivi &dp) {
//printf("i0=%d, i1=%d\n", i0, i1);
dp.clear();
dp[0].push_back(0);
for (int i = i0; i < i1; i++) {
//printf("i=%d\n", i);
int bi = (1 << (n - 1 - i));
vpivi dpi(dp.rbegin(), dp.rend());
for (vpivi::iterator vitj = dpi.begin(); vitj != dpi.end(); vitj++) {
int k = vitj->first + ps[i];
if (k <= s) {
//printf(" j=%d -> k=%d\n", vitj->first, k);
vi &bsj = vitj->second;
vi &bsk = dp[k];
for (vi::iterator vit = bsj.begin(); vit != bsj.end(); vit++)
bsk.push_back(*vit | bi);
}
}
}
return;
for (mivi::iterator mit = dp.begin(); mit != dp.end(); mit++) {
vi &v = mit->second;
for (vi::iterator vit = v.begin(); vit != v.end(); vit++) {
int sum = 0;
for (int i = 0; i < n; i++)
if (*vit & (1 << (n - 1 - i))) sum += ps[i];
if (sum != mit->first) printf("%d <-> %d\n", mit->first, sum);
}
}
}
void print_vi(int n, vi &bs) {
sort(bs.begin(), bs.end(), greater<int>());
for (vi::iterator vit = bs.begin(); vit != bs.end(); vit++) {
bool first = true;
for (int i = 0, bi = (1 << (n - 1)); i < n; i++, bi >>= 1)
if (*vit & bi) {
if (! first) putchar(' ');
first = false;
printf("%d", i + 1);
}
putchar('\n');
}
}
/* main */
int main() {
int n, s;
cin >> n >> s;
for (int i = 0; i < n; i++) cin >> ps[i];
if (n < MAX_N / 2) {
do_dp(n, s, 0, n, dp0);
print_vi(n, dp0[s]);
}
else {
int hn = n / 2;
do_dp(n, s, 0, hn, dp0);
do_dp(n, s, hn, n, dp1);
//printf("dp0=%lu, dp1=%lu\n", dp0.size(), dp1.size());
vi ans;
for (mivi::iterator mit0 = dp0.begin(); mit0 != dp0.end(); mit0++) {
vi &bs0 = mit0->second;
//printf("s=%d: dp0=%d, dp1=%d\n", s, mit0->first, s - mit0->first);
mivi::iterator mit1 = dp1.find(s - mit0->first);
//vi &bs1 = dp1[s - mit0->first];
if (mit1 != dp1.end()) {
//printf(" mit1=%d\n", mit1->first);
vi &bs1 = mit1->second;
for (vi::iterator vit0 = bs0.begin(); vit0 != bs0.end(); vit0++)
for (vi::iterator vit1 = bs1.begin(); vit1 != bs1.end(); vit1++)
ans.push_back(*vit0 | *vit1);
}
}
print_vi(n, ans);
}
return 0;
}
tnakao0123