I wanted to open an issue to understand why `bnb_search` as [implemented](https://github.com/bitcoin/bitcoin/pull/10637) @achow101 does not terminate once an optimal search is found.  This behavior is evident I believe when inspecting the [test](https://github.com/bitcoin/bitcoin/blob/master/src/wallet/test/coinselector_tests.cpp#L178) which sets the target to `5` and uses the utxo pool `4,3,2,1`.  since combinations of `4` are evaluated first, the `bnb_search` finds an optimal solution of `4,1`.  However, instead of terminating when the `best_waste = 0` (no better solution can be found), the search continues and instead finds another solution `2,3` which also has a `best_waste = 0`.  Why not terminate once an optimal solution is found instead of continuing to search?
for (int i = 0; i < 100; ++i) {
        BOOST_CHECK(!SelectCoinsBnB(GroupCoins(utxo_pool), 1 * CENT, 2 * CENT, selection, value_ret, not_input_fees));
    }
    
    CoinSelectionParams coin_selection_params_bnb(true, 0, 0, CFeeRate(3000), 0);
    CoinSet setCoinsRet;
    CAmount nValueRet;
    bool bnb_used;
    empty_wallet();
    add_coin(1);
    vCoins.at(0).nInputBytes = 40; 
    BOOST_CHECK(!testWallet.SelectCoinsMinConf( 1 * CENT, filter_standard, GroupCoins(vCoins), setCoinsRet, nValueRet, coin_selection_params_bnb, bnb_used));
    
    empty_wallet();
    add_coin(1 * CENT);
    vCoins.at(0).nInputBytes = 40;
    BOOST_CHECK(!testWallet.SelectCoinsMinConf( 1 * CENT, filter_standard, GroupCoins(vCoins), setCoinsRet, nValueRet, coin_selection_params_bnb, bnb_used));
    coin_selection_params_bnb.m_subtract_fee_outputs = true;
    BOOST_CHECK(testWallet.SelectCoinsMinConf( 1 * CENT, filter_standard, GroupCoins(vCoins), setCoinsRet, nValueRet, coin_selection_params_bnb, bnb_used));
    BOOST_CHECK_EQUAL(nValueRet, 1 * CENT);
    
    empty_wallet();
    {
        std::unique_ptr<CWallet> wallet = MakeUnique<CWallet>(m_chain.get(), WalletLocation(), WalletDatabase::CreateMock());
        bool firstRun;
        wallet->LoadWallet(firstRun);
        wallet->SetupLegacyScriptPubKeyMan();
        LOCK(wallet->cs_wallet);
        add_coin(*wallet, 5 * CENT, 6 * 24, false, 0, true);