思路:题目求:配料组合 的酸度乘积 与 苦度总和 的 差值的绝对值的最小值
暴力搜索:因为至少需要一种配料,所以从1遍历至n, 求解每一种 配料总数 的情况,这里用了回溯的思想,穷举了所有情况,用变量x表示当前的配料总数,用变量nn表示要达到的配料总数,当x=n,说明达到判断条件,更新最小值。
代码如下:
#include<iostream>
using namespace std;
#include<string.h>
#include<limits.h>
int n;
int a[11][2];
int cg = 1;//酸味总乘积
int qh = 0;//苦味总和
int pj =INT_MAX;//要求的值,即酸味总乘积与苦味总和的差的绝对值的最小值,pj=abs(cg-qh);
int visit[11] = {0};
void f(int nn, int x)//深度搜索
{
if (x == nn)//检查是否为解
{
pj = min(pj, abs(cg - qh));//取二者较小值
return;
}
for (int i = 0;i < n;i++) {//遍历每一种配料
if (visit[i] == 0) {//若没放过这种配料,则尝试放入
cg = cg * a[i][0];
qh += a[i][1];
visit[i] = 1;//尝试
f(nn, ++x);//下一轮判断
//回溯
cg /= a[i][0];
qh -= a[i][1];
visit[i] = 0;
x--;//回溯
}
}
}
int main()
{
cin >> n;
for (int i = 0;i < n;i++)
{
cin >> a[i][0] >> a[i][1];
//输入每种配料的酸味和苦味
}
for (int i = 1;i <= n;i++)//因为至少要放一种配料,所以需要从1开始
{
f(i, 0);
memset(visit, 0, sizeof(visit));//初始化
cg = 1;
qh = 0;
}
cout << pj;
}