当前位置:网站首页>uva1377
uva1377
2022-07-27 20:09:00 【Stab the bear with a knife】
#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
const int maxn = 64,maxm = 2100000;
int n,m,input[maxn],mx,vis[maxm];
unordered_map<int, int> mmp;
vector<int> ans;
struct Node {
int state;
set<int> st;
bool isOver(int val) {
return state == val;
}
bool HasFlag(int index) {
return state & (1 << index);
}
vector<int> GetResult() {
vector<int> ret;
for (auto it = st.begin(); it != st.end(); it++) {
ret.push_back(*it);
}
return ret;
}
void AddVal(int input) {
int dis = 0;
for (auto it = st.begin(); it != st.end(); it++) {
dis = abs(*it - input);
if (!mmp.count(dis)) continue;
state |= (1 << mmp[dis]);
}
st.insert(input);
}
};
void bfs() {
queue<Node> q;
Node head;
head.state = 0;
head.st.insert(0);
q.push(head);
int over = (1 << n) - 1;
while (!q.empty()) {
head = q.front(); q.pop();
if (head.isOver(over)) {
ans = head.GetResult();
return;
}
if (head.st.size() >= 7) continue;
for (int i = 0; i < n; i++) {
if (!head.HasFlag(i)) {
for (auto it = head.st.begin(); it != head.st.end(); it++) {
if (*it + input[i] <= mx) {
int nx = *it + input[i];
Node tmp = head;
tmp.AddVal(nx);
if (vis[tmp.state])continue;
vis[tmp.state] = 1;
q.push(tmp);
}
}
}
}
for (int i = 0; i < n; i++) {
if (!head.HasFlag(i)) {
for (auto it = head.st.begin(); it != head.st.end(); it++) {
if (*it - input[i] > 0) {
int nx = *it - input[i];
Node tmp = head;
tmp.AddVal(nx);
if (vis[tmp.state])continue;
vis[tmp.state] = 1;
q.push(tmp);
}
}
}
}
}
}
int main() {
int kCase = 1;
while (cin >> n && n) {
mmp.clear();
for (int i = 0; i < n; i++) cin >> input[i];
sort(input, input + n);
n = unique(input, input + n) - input;
memset(vis, false, sizeof(vis));
mx = input[n - 1];
for (int i = 0; i < n; i++) mmp[input[i]] = i;
ans.clear();
bfs();
int sz = ans.size();
cout << "Case " << kCase++ << ":" << endl << sz << endl;
for (int i = 0; i < sz; i++) {
if (i)cout << " " << ans[i];
else cout << ans[i];
}
cout << endl;
}
return 0;
}
边栏推荐
猜你喜欢

统一建模语言 (UML) 规范

ECU software and hardware architecture

1.2、基于增量式生成遮挡与对抗抑制的行人再识别(代码理解与实验进度+报告)

产品经理:排查下线上哪里冒出个“系统异常”的错误提示

剑指 Offer 25. 合并两个排序的链表

高手勿进!写给初中级程序员以及还在大学修炼的“准程序员”的成长秘籍

Source code analysis of Chang'an chain data storage

YY English learning about fish

Detailed introduction to common coordinate system of cesium

GLTF模型添加关节控制
随机推荐
Assignment 1 - Hello World ! - Simple thread Creation
libpcap库和pcap_sendpacket接口函数了解
uva1377
[IOT] Wei Peng: Interpretation of 6000 + words | seven necessary product management tools for product people in 2022 (version 1.0)
Static test. 2021.01 .13
Function priority
22年PMP考试【全真敏捷试题】
C#网络应用编程,实验一:WPF练习
Datepicker and TimePicker
探索新一代活动获客方式,虚拟化活动棋胜一招 | 厂商征集
What does bus mean
内置函数锁相关
TS2532: Object is possibly ‘undefined‘
mysql函数汇总之系统信息函数
【IoT】卫朋:6000+ 字解读 | 2022年产品人必备的7个产品管理工具(1.0版)
JS 数组方法 forEach 和 map 比较
Built in module 10.18
第2章 入门
Chapter 3 basic operation
[C # network application programming] Experiment 3: process management exercise