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;
}
posted @ 2025-04-05 10:08  夕瑶^  阅读(21)  评论(0)    收藏  举报