감사 tmyklebu에, 여기 내 코드는 다음과 같습니다
#include <fstream>
#include <cstdio>
#include <string.h>
#include <iostream>
#include <sstream>
#include <map>
#include <bitset>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define CLR(T, V) memset(T, V, sizeof T)
typedef unsigned long long u;
/* ---------------------- BEGIN ----------------------- */
const int NN = 100;
int W[NN];
int count_bits(int i) {
int c;
for (c = 0; i; c++)
i &= i - 1; // clear the least significant bit set
return c;
}
u sum_subset(int S, int offset=0) {
bitset<64> bs(S);
u sum = 0;
FOR(i, 0, 64)
if (bs[i]) sum += W[offset + i];
return sum;
}
string int_to_string(int i) {
ostringstream stream;
stream << i;
return stream.str();
}
string solve(int N, int D) {
map<u, int> sum;
map<u, int> nb_arg_sum;
int pile_size = (N+1)/2;
int nb_subsets = 1 << pile_size;
FOR(i, 0, nb_subsets) {
u s = sum_subset(i);
map<u, int>::iterator it = sum.find(s);
if (it == sum.end())
nb_arg_sum[s] = 1;
else if(nb_arg_sum[s] == 1) {
nb_arg_sum[s] = 2 - (count_bits(i) == count_bits(it->second));
}
sum[s] = i;
}
int nb_sol = 0;
int sol = - 1;
nb_subsets = 1 << (N - pile_size);
FOR(i, 0, nb_subsets) {
u s = sum_subset(i, pile_size);
map<u, int>::iterator it = sum.find(D - s);
if (it != sum.end()) {
int sol2 = count_bits(i) + count_bits(it->second);
if ((sol >= 0 && sol != sol2) || nb_arg_sum[D - s] > 1) return "AMBIGIOUS";
sol = sol2;
}
}
return (sol >= 0) ? int_to_string(sol) : "IMPOSSIBLE";
}
int main() {
#ifndef ONLINE_JUDGE
ifstream input("input.txt");
#define cin input
#endif
int T; cin >> T;
FOR(i, 0, T) {
CLR(W, 0);
int N, D;
cin >> N >> D;
FOR(j, 0, N) cin >> W[j];
cout << "Case #" << i + 1 << ": " << solve(N, D) << endl;
}
#ifndef ONLINE_JUDGE
system("pause");
#endif
return 0;
}
당신이
당신은 내가이 문제를 해결할 수있는 방법에 대한 어떤 생각을 가지고 있습니까 무슨 생각을 말해? – maroxe
_ '이 문제를 어떻게 해결할 수 있는지 알고 싶으십니까?'_ ** 아니요! ** 자신 만의 시도를하고 특히 겪고있는 문제를 설명하십시오! –