#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const int maxn = 1007;
int n, c, a[maxn], ans;
LL sum[maxn];
void dfs(int cnt, int w) { //cnt下标,w剩余容量
if(w < 0) return ;
if(cnt == 1) {
if(w >= a[1]) w -= a[1];
ans = min(ans, w);
return ;
}
if(w >= sum[cnt]) {
w -= sum[cnt];
ans = min(ans, w);
return ;
}
dfs(cnt-1, w-a[cnt]);
dfs(cnt-1, w);
}
int main() {
while(~scanf("%d%d", &n, &c)) {
ans = (1<<30)+1;
sum[0] = 0;
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
sum[i] = sum[i-1] + a[i];
}
if(c < a[1]) {
printf("0\n");
continue;
}
int cnt = n;
for(int i = n; i >= 1; --i) {
if(a[i] <= c) {
cnt = i; break;
}
}
dfs(cnt, c);
printf("%d\n", c-ans);
}
return 0;
}
POJ 3172 (dfs写0-1背包)
最新推荐文章于 2019-08-09 21:34:22 发布