AcWing 171. 送礼物
双向DFS,用空间换时间的思想,将所有数据分为两部分,前半部分组合求和之后放入表中,后半部分对表二分找到合适的值(允许的最大值)和第二部分的数挨个进行
组合找到最大值
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 50, M = 1 << 24;
int n, m;
int w[N];
int weight[M]; //前半部分所有组合数的和
int k;
int ans;
int cnt;
void dfs(int u, int s){
//打表找组合数和,u代表的搜索到的第几个数,s表示目前组合数的和
if(u