重点在于如何枚举出所有的可能性
2026-04-16 15:49:16
发布于:北京
0阅读
0回复
0点赞
学过深搜可以用深搜的思路,至少包含一个的组合问题。
但如果没学过深搜,怎么做到枚举出所有可能性呢,想到二进制,二进制只有0、1,可以用来表示是否使用某种配料。例如:1011,表示用到了第1、2、4种配料。
n最大为10,全部为1时对应的十进制数为210-1=1023。枚举1~(2n-1)之间的所有数,即枚举到了所有的可能性,然后十进制转二进制确定此时具体选择的配料。
#include<bits/stdc++.h>
using namespace std;
struct node{
int s, b;
}a[15];
int main(){
int n, ans=INT_MAX;
cin>>n;
for(int i=1; i<=n; i++) cin>>a[i].b>>a[i].s;
int num=pow(2, n)-1;
for(int i=1; i<=num; i++){ //枚举所有可能性
int tmp=i, idx=1, p=1, sum=0; //idx表示使用到的配料编号
while(tmp){
if(tmp%2==1){ //值为1,用到当前配料
p*=a[idx].b;
sum+=a[idx].s;
}
tmp/=2;
idx++;
}
ans=min(ans, abs(p-sum));
}
cout<<ans;
return 0;
}
这里空空如也

有帮助,赞一个