题目描述
Perket 是一种流行的美食。为了做好 Perket,厨师必须谨慎选择食材,以在保持传统风味的同时尽可能获得最全面的味道。你有 nn 种可支配的配料。对于每一种配料,我们知道它们各自的酸度 ss 和苦度 bb。当我们添加配料时,总的酸度为每一种配料的酸度总乘积;总的苦度为每一种配料的苦度的总和。
众所周知,美食应该做到口感适中,所以我们希望选取配料,以使得酸度和苦度的绝对差最小。
另外,我们必须添加至少一种配料,因为没有任何食物以水为配料的。
输入格式
第一行一个整数 nn,表示可供选用的食材种类数。
接下来 nn 行,每行 22 个整数 s_isi 和 b_ibi,表示第 ii 种食材的酸度和苦度。
输出格式
一行一个整数,表示可能的总酸度和总苦度的最小绝对差。
输入输出样例
输入 #1复制
1 3 10输出 #1复制
7输入 #2复制
2 3 8 5 8输出 #2复制
1输入 #3复制
4 1 7 2 6 3 8 4 9输出 #3复制
1说明/提示
数据规模与约定
对于 100\%100% 的数据,有 1 \leq n \leq 101≤n≤10,且将所有可用食材全部使用产生的总酸度和总苦度小于 1 \times 10^91×109,酸度和苦度不同时为 11 和 00。
说明
- 本题满分 7070 分。
1.这个依旧是一个dfs问题。
2.我们需要选择到所有的结果,那我们就只往后面寻找。从前面所给的,我们永远只往后面寻找。
3.往后dfs需要注意的一个问题是递归的参数要是当前的i,不然会产生很多重复的,而且AC会卡在40.
4.min的值必须是最大值,酸的初值要是1,苦的初值要是0。
代码如下:
#include<stdio.h>
#include<math.h>
int min=2147483647;
int sour[15],bit[15];
int dfs(int step,int n,int s1,int s2)
{
if(step==n)
{
return 0;
}
int i,ts1,ts2;
for(i=step;i<n;i++)
{
ts1=s1*sour[i];
ts2=s2+bit[i];
if(min>abs(ts1-ts2)) min=abs(ts1-ts2);
//printf("%d--%d\n",i,abs(ts1-ts2));
dfs(i+1,n,ts1,ts2);
}
}
int main()
{
int t,i;
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%d%d",&sour[i],&bit[i]);
}
dfs(0,t,1,0);
printf("%d\n",min);
return 0;
}