买瓜
题目描述
https://www.dotcpp.com/oj/problem3145.html
代码
#include<iostream>
using namespace std;
int size;
int target;
double nums[35][3];
double absnums[35];//表示的是后面所有值的和
int ans;
void dfs(int index, double sum, int anspath) {
//cout << sum <<endl;
if(sum + absnums[index] < target) {
//剪枝一
return;
}
if(anspath >= ans || sum > target) {
//剪枝二
return;
}
if(sum == target) {
ans = min(ans, anspath);
return;
}
if(index >= size) {
//结束条件
return;
}
for(int i = 0; i < 3; i++) {
dfs(index + 1, sum + nums[index][i], (i == 1 ? anspath + 1 : anspath));
}
}
int main()
{
double pos;
cin >> size >> target;
for(int i = 0; i < size; i++) {
cin >> pos;
nums[i][0] = 0;
nums[i][1] = pos/2;
nums[i][2] = pos;
}
absnums[size - 1] = nums[size - 1][2];
for (int i = size - 1; i >= 0; i--) {
absnums[i] = absnums[i + 1] + nums[i][2];
}
//for(int i = 0; i < size; i++) {
//cout << absnums[i] <<" ";
//}
//for(int i = 0; i < size; i++) {
//for(int j = 0; j < 3; j++) {
//cout << nums[i][j] << " ";
//}
//cout << endl;
//}
ans = size + 1;
dfs(0, 0, 0);
cout << (ans == size + 1 ? -1 : ans);
return 0;
}

浙公网安备 33010602011771号