思路:
解决一个关于选择和处理 “瓜” 的组合优化问题。给定了一定数量的 “瓜”(数量为 n),每个 “瓜” 有其自身的质量(存储在数组 a 中),需要通过选择和可能的 “劈” 操作(将瓜的质量减半),使得所选瓜的总质量尽可能接近给定的目标质量 m,并输出达到或最接近目标质量所需的最少操作次数(选瓜或劈瓜的操作)。如果无法达到或接近目标质量,则输出 -1。
代码展示:
#include<bits/stdc++.h>
using namespace std;
const int N = 50;
int ans = 50;
int n, m;
double a[N];//存每个瓜的重量
double s[N];//用来计算后缀和,后面有用
void dfs(int u, double w, int cnt)
{if (w == m) {ans = min(ans, cnt);return;}if (u >= n) return;//如果n个瓜都遍历完了,返回if (cnt >= ans) return;//当前方案不犹于已有的合法答案,返回if (w > m) return;//如果总质量已经超了,返回if (w + s[u] < m) return;//如果当前所选瓜的总质量 w 加上从当前瓜往后的所有瓜的质量总和都小于m,返回//选但不劈dfs(u + 1, w + a[u],cnt);//选、劈dfs(u + 1, w + a[u] / 2, cnt + 1);//不选dfs(u + 1, w, cnt);
}
int main()
{cin >> n >> m;for (int i = 0; i < n; i++){cin >> a[i];}sort(a, a + n, greater<>());//从大到小排序for (int i = n - 1; i >= 0; i--)//后缀和{s[i] = s[i + 1] + a[i];}dfs(0, 0, 0);if (ans == 50) printf("-1");else printf("%d", ans);return 0;
}