洛谷P2036 [COCI2008-2009#2] PERKET
题目描述
Perket 是一种流行的美食。为了做好 Perket,厨师必须谨慎选择食材,以在保持传统风味的同时尽可能获得最全面的味道。你有 n 种可支配的配料。对于每一种配料,我们知道它们各自的酸度 s 和苦度 b。当我们添加配料时,总的酸度为每一种配料的酸度总乘积;总的苦度为每一种配料的苦度的总和。
众所周知,美食应该做到口感适中,所以我们希望选取配料,以使得酸度和苦度的绝对差最小。
另外,我们必须添加至少一种配料,因为没有任何食物以水为配料的。
输入格式
第一行一个整数 n,表示可供选用的食材种类数。
接下来 n 行,每行 22 个整数 si 和 bi,表示第 i 种食材的酸度和苦度。
输出格式
一行一个整数,表示可能的总酸度和总苦度的最小绝对差。
dfs深搜即可
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N = 11; int n; int suan = 1; int ku ; int s[N]; int k[N]; int st[N]; int minx = 0x3f3f3f3f; void dfs(int u) { if(u > n) { for(int i = 1 ; i <= n ; i++) { if(st[i] == 1) { suan *= s[i]; ku += k[i]; minx = min(minx,abs(suan - ku)); } } suan = 1; ku = 0; return ; } st[u] = 2; dfs(u+1); st[u] = 0; st[u] = 1; dfs(u+1); st[u] = 0; } int main() { cin>>n; for(int i = 1 ; i <= n ; i++) { cin>>s[i]>>k[i]; } dfs(1); cout<<minx; return 0; }
借用一下大佬的位运算方法
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #define ll long long using namespace std; int N,s[12],b[12],mi=2000000001; int main() { scanf("%d",&N); for(int i=0;i<N;i++) scanf("%d %d",&s[i],&b[i]); for(int i=1;i<(1<<N);i++) { int S=1,B=0; for(int j=0;j<N;j++) if((i>>j)&1) { S*=s[j]; B+=b[j]; } mi=min(mi,abs(S-B)); } printf("%d",mi); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律