P2036 [COCI 2008/2009 #2] PERKET
更像是暴力破解的一道题,也可能是我忘了dfs咋用
每种食材都有两种选择,选或不选,可以想起来“树”。然后我们会在所有组合的情况中找一个差值最小的
因为不能一种食材也不选,也就是kd!=0,但是注意这个条件所在位置。如果添加到外层if语句,那当 step == n 且 kd == 0 时,没有 return,程序会继续往下运行
代码见下:
//暴力破解,每个食材都有选和不选两种选择
#include<bits/stdc++.h>
using namespace std;
int n,s[15],b[15],ans=1000000000;
void f(int step,int sd,int kd){
// 终止条件
if(step==n)
{
int temp=abs(sd-kd);
if(temp<ans&&kd!=0) ans=temp;
return;
}
step++;
// 选该食材
f(step,sd*s[step],kd+b[step]);
// 不选该食材
f(step,sd,kd);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i]>>b[i];
}
f(0,1,0);
cout<<ans;
}

浙公网安备 33010602011771号