洛谷 P2036 [COCI2008-2009#2] PERKET DFS

简单DFS


直接上图片

洛谷 P2036 [COCI2008-2009#2] PERKET DFS_第1张图片

 

 简单思路

题目所给配料数 N 位于 0 到 10之间,果断DFS枚举每一种情况,对于每种配料进行选与不选的判断,直到枚举完所有情况。同时需要注意,不能一个配料都不选,所以在这里我选用了定义一个栈,在最后判断栈是否为空的方式来判断是否选择了配料。

闲话不多说,直接上代码。

 

#include 
#include 
#include <string.h>
#include 
#include 
using namespace std;
#define fastio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int INF = 0x3f3f3f3f;
typedef long long ll;

struct cook {
    int acid;
    int sweet;
}c[15];

int minChoose = INF;

int n ;

int sumAcid = 1;
int sumSweet = 0;

stack s;

void dfs(int deep){
    if(deep > n){//如果所有配料都判断完了
        if(abs(sumAcid - sumSweet) < minChoose && !s.empty()){
            minChoose = abs(sumAcid -  sumSweet);
        }
        return;
    }
    //
    sumAcid *= c[deep].acid;
    sumSweet += c[deep].sweet;
    s.push(c[deep]);
    dfs(deep + 1);
    //不选
    sumAcid /= c[deep].acid;
    sumSweet -= c[deep].sweet;
    s.pop();
    dfs(deep + 1);
}

int main()
{
    fastio;
    cin >> n;
    for(int i = 1 ;i <= n;i++){
        cin >> c[i].acid >> c[i].sweet; 
    }
    dfs(1);
    cout << minChoose << endl;
    return 0;
}
点我看代码>。<

 

  

 

 

 

 

你可能感兴趣的:(洛谷 P2036 [COCI2008-2009#2] PERKET DFS)