题解 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的后话了】 应该没什么不懂的吧。。。