滚地数组

#include <iostream>
using namespace std;
int a[40];
int f[20020]; //数组滚动
int n, v;

int main(){
    cin >> v >> n;
    for(int i = 1;i <= n;++ i) cin >> a[i];
    f[0] = 1; //初始化
    
    for(int i = 1;i <= n;++ i){
        for(int j = v;j >= a[i];j --){ //j从0开始遍历到v,然后选与不选都设置为真
                f[j] = f[j] || f[j - a[i]];
        }
    }
    int ans = 0;
    for(int i = v;i >= 0;i --){ //倒序遍历
        if(f[i]){ //只要有为真的就说明此时是体积剩余最小的
            ans = v - i;
            break;
        }
    }
    cout << ans << endl;
    return 0;
}