![](https://i-blog.csdnimg.cn/blog_migrate/98076c09d9baf01d9202e57a8c626868.png)
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n, x;
int a[31] = { 0 };
int f[300010] = { 0 };
int main() {
cin >> n >> x;
int i;
int sum = 0;
for (i = 1; i <= n; i++) {
cin >> a[i];
sum += a[i];
}
int j;
for (i = 1; i <= n; i++) {
for (j = sum; j >= a[i]; j--) {
f[j] = max(f[j], f[j - a[i]] + a[i]);
}
}
for (i = x;; i++) {
if (f[i] >= x) {
cout << f[i];
break;
}
}
}
二
![](https://i-blog.csdnimg.cn/blog_migrate/999d0c484a8017c99a840e8342159297.png)
# include <iostream>
# include <algorithm>
# define maxn 300010
using namespace std;
int n, x;
int v[40] = { 0 };
int f[40][maxn] = { {0} };
int main()
{
cin >> n >> x;
int sum = 0;
for (int i = 1; i <= n; i++) {
cin >> v[i];
sum += v[i];
}
int y = sum - x;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= y; j++) {
f[i][j] = f[i - 1][j];//背包问题的核心公式
if (j >= v[i]) {
f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + v[i]);//背包问题的核心公式
}
}
}
int r = sum - f[n][y];
cout << r << endl;
return 0;
}