DFS
本題還沒有用到剪紙,但是我覺得在枚舉DFS的深度上有了想法
//https://www.luogu.com.cn/problem/P2036?contestId=96626
//DFS
#include<cstdio>
#include<math.h>
using namespace std;
#define MAXINT 999999
int n;//有幾種調料
//int tiao[11][3];//調料數(shù)組
bool visited[11];
int s[11];
int k[11];
int flavor=MAXINT;
void DFS(int put,int i)//i代表可以枚舉的調料的個數(shù),put代表放了幾個調料了
{
? ?if(put>=i)//放的調料數(shù)量大于可以放的調料數(shù)目
? ?{
? ? ? ?//遍歷所有已經放過的調料去統(tǒng)計此時的口味
? ? ? ?int suan=1;
? ? ? ?int ku=0;
? ? ? ?for(int m=1;m<=n;m++)
? ? ? ?{
? ? ? ? ? ?if(visited[m]==true)
? ? ? ? ? ?{
? ? ? ? ? ? ? ?//計算所有的酸度
? ? ? ? ? ? ? ?suan=suan*s[m];
? ? ? ? ? ? ? ?ku ?=ku ?+k[m];
? ? ? ? ? ?}
? ? ? ?}
? ? ? ?int ciflavor=abs(suan-ku);
? ? ? ?if(ciflavor<flavor)
? ? ? ?{
? ? ? ? ? ?flavor=ciflavor;//更新更小值
? ? ? ?}
? ? ? ?return;
? ?}
? ?for(int k=1;k<=n;k++)
? ?{
? ? ? ?if(visited[k]==false)
? ? ? ?{
? ? ? ? ? ?visited[k]=true;
? ? ? ? ? ?DFS(put+1,i);
? ? ? ? ? ?visited[k]=false;
? ? ? ?}
? ?}
}
int main()
{
? ?scanf("%d",&n);
? ?for(int i =1;i<=n;i++)
? ?{
? ? ? ?visited[i]=false;
? ?}
? ?for(int i=1 ; i<=n;i++)
? ?{
? ? ? ?scanf("%d%d",&s[i],&k[i]);//輸入酸度
? ?}
? ?//從一種調料開始枚舉枚舉到n種調料,類比于一個滑動窗口
? ?for(int i=1;i<=n;i++)
? ?{
? ? ? ?int put=0;//已經放了幾個調料了
? ? ? ?DFS(put,i);
? ?}
? ?printf("%d",flavor);
}