题解 P2036 【Perket】
发现居然没有二进制模拟这么方便的代码
写起来超级简单的(虽然比DFS稍微慢一点点
但是思维复杂度比较低
具体解释看代码吧
#include<bits/stdc++.h>
using namespace std;
int n , numsour , numsweet , ans=1000000001 ;
int sour[11] , sweet[11] , b[11] ;
int main()
{
cin >> n ;
for ( int i=1; i<=n; i++ )cin >> sour[i] >> sweet[i] ;
while (true) //不能把出口写在这,因为不能选择所有调料都不放
{
b[n]++ ;numsour=1;numsweet=0;
for ( int i=n; i>=1; i-- )
if (b[i]==2) //**手动进位**
{
b[i]=0;
b[i-1]++;
}
if (b[0]==1)break; //**出口,当所有情况枚举结束就完成了,PS:一定要...写在里面,我一开始写在WHILE条件上结果WA了**
for ( int i=1; i<=n; i++ )
if (b[i]==1) //B数组表示的是0、1, 0是不选择当前调料,1是选择当前调料
{
numsour*=sour[i];
numsweet+=sweet[i];
}
ans=min(ans,abs(numsour-numsweet));
}
cout << ans ;
return 0;
}
是不是比起DFS好看多了??【但是的确会慢点,但那是N<=30的后话了】 应该没什么不懂的吧。。。