如果这是最后一页,在你离开之前,能否让我把故事重写
题目链接:P2036 [COCI2008-2009 #2] PERKET - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
解题思路:
dfs模板题,枚举每种调料取和不取,至少选一种调料,每次作比较即可
下面是c++代码:
#include<iostream>
using namespace std;
long long n;
long long sour[100010];//酸
long long bitter[100010];//苦
int st[100010];//表示状态,1表示取,2表示不取
long long Min = 1e9;
void dfs(int num){
if(num > n){
bool is = false;//记录有没有选调料
long long sum1 = 1;
long long sum2 = 0;
for(int i = 1;i <= n;i++){
if(st[i] == 1){
is = true;//表示选了调料
sum1 *= sour[i];
sum2 += bitter[i];
}
}
if(is)//至少有一种调料被选
{
Min = min(Min,abs(sum1 - sum2));
}
return;
}
st[num] = 1;
dfs(num + 1);
st[num] = 0;
st[num] = 2;
dfs(num + 1);
st[num] = 0;
}
int main()
{
cin >> n;
for(int i = 1;i <= n;i++){
cin >> sour[i] >> bitter[i];
}
dfs(1);
cout << Min;
return 0;
}