二进制就是比谁更sao...
Code:
#include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) using namespace std; int maxv[1 << 17], sumv[1 << 17], t[1000], w[1000], v[500000], f[1 << 17]; int W, n, tot; int main() { // setIO("input"); scanf("%d%d",&W,&n); for(int i = 1; i <= n; ++i) { scanf("%d%d",&t[i],&w[i]); } for(int i = 0; i < (1 << n); ++i) { int x = i, y = 1; while(x) { if(x & 1) maxv[i] = max(maxv[i], t[y]), sumv[i] += w[y]; x >>= 1; ++y; } if(sumv[i] <= W) v[++tot] = i; } memset(f, 0x3f, sizeof(f)); f[0] = 0; for(int i = 1; i < (1 << n); ++i) { for(int j = 1; j <= tot && v[j] <= i; ++j) { if((i & v[j]) == v[j]) { f[i] = min(f[i], f[i - v[j]] + maxv[v[j]]); } } } printf("%d\n", f[(1 << n) - 1]); return 0; }