这个题目有三种情况,选整个瓜,选半个瓜,不选,并且这三种方案对应增加的重量也是逐级递减,因此可以根据这三种情况进行指数型枚举,并传入多个参数简化代码,再根据实时的瓜的重量是否大于目标瓜的重量来选择对应的方案。代码如下
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 35;
int arr[N];
int n;
double m;
int ans = -1;
int flag = 0;
void dfs(int x, double sum, int y)//x表示当前考虑到了第几个瓜,y表示需要砍几刀,sum表示当前瓜的总重量
{
if (x > n || sum >= m) {//如果考虑完了所有西瓜或者已经大于等于了目标重量
if (sum == m) { //如果已经满足了,那就直接退出(剪枝)
ans = y;
flag = 1;
return;
}
else return;
}
//选整个瓜
dfs(x + 1, sum + arr[x], y);
if (flag) return;
//选半个瓜
dfs(x + 1, sum + ((double)arr[x] / 2.0), y + 1);
if (flag) return;
//不选
dfs(x + 1, sum, y);
if (flag) return;
}
int main(void)
{
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
dfs(1, 0, 0);
cout << ans << endl;
return 0;
}
但是这种方案无法通过所有的案例
希望对有所帮助