题目链接:https://syzoj.com/problem/110
内存限制:512 MiB 时间限制:1000 ms

题目描述

现在有n个物品,每个物品都有他的编号,从0开始0..n-1。他们都有各自对应的体积v(i)。现在要把这n个物品尝试着放入一个体积为V的容器中,请问最多能放进去的体积之和是多少?

输入格式

第一行2个整数n,V,表示共有n个物品,容器体积为V

第二行n个整数,表示v(0)..v(n-1)

输出格式

一行,一个整数,表示装进去的体积的最大和

样例输入

2 4294967296
2147483648 233

样例输出

2147483881

数据范围与提示

2 <= n <= 20
2^31 <= v(i), V <= 2^40

解题思路

01背包问题,为体积过大,数量较小,可以直接递归求01背包。
Accepted Code:

#include <bits/stdc++.h>
using namespace std;
long long v[25];
long long dp(int n, long long m) {
    if (n < 1)
        return 0;
    if (v[n] > m)
        return dp(n - 1, m);
    return max(dp(n - 1, m), dp(n - 1, m - v[n]) + v[n]);
}
int main() {
    int n;
    long long m;
    scanf("%d%lld", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%lld", &v[i]);
    printf("%lld\n", dp(n, m));
    return 0;
}