买瓜

题目描述

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;
}
posted @ 2023-08-10 21:50  铜锣湾陈昊男  阅读(19)  评论(0)    收藏  举报