这是一个图的划分问题,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决。我们需要找到一种划分方式,使得划分后的两部分总重的差值的绝对值最小。
以下是对应的C++代码:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
const int MAXN = 15;
vector<int> G[MAXN];
int weight[MAXN];
bool visited[MAXN];
int total_weight, min_diff = 1e9, N; // 使用1e9代替INT_MAX
void dfs(int node, int sum) {
visited[node] = true;
for(int i = 0; i < G[node].size(); i++) {
int next_node = G[node][i];
if(!visited[next_node]) {
dfs(next_node, sum + weight[next_node]);
}
}
min_diff = min(min_diff, abs(total_weight - 2 * sum));
visited[node] = false;
}
int main() {
int M;
cin >> N >> M;
for(int i = 1; i <= N; i++) {
cin >> weight[i];
total_weight += weight[i];
}
for(int i = 0; i < M; i++) {
int X, Y;
cin >> X >> Y;
G[X].push_back(Y);
G[Y].push_back(X);
}
dfs(1, weight[1]);
cout << min_diff << endl;
return 0;
}
这段代码首先读取珠子的数量、重量和连接情况,然后使用深度优先搜索(DFS)遍历所有可能的划分方式,计算每种划分方式的总重差值的绝对值,并更新最小差值。最后,输出最小差值。