题目连接: Barbells
大致题意:
给你n个杠铃的杠杆, m个配重, 平衡杠杆的左右两端时, 杠铃的重量即为一种解, 要求从小到大输出所有解
解题思路:
暴力dfs, 对于配重, 只有三种选择, 加在左侧, 加在右侧, 不加. 得出所有使杠杆平衡的配重重量, 然后分别与杆重做和排序即可.
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll w[20];
ll a[20];
set<ll> s;
set<ll> st;
int n, m;
void dfs(ll l = 0, ll r = 0, ll index = 1) {
if (l == r && l != 0) st.insert(l + r);
if (index > m) return;
dfs(l + w[index], r, index + 1);
dfs(l, r + w[index], index + 1);
dfs(l, r, index + 1);
}
int main(void)
{
ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i <= m; ++i) cin >> w[i];
dfs();
for (int i = 1; i <= n; ++i) {
s.insert(a[i]);
for (auto it : st) {
s.insert(a[i] + it);
}
}
for (auto i : s) cout << i << endl;
return 0;
}