根据题意原问题属于01背包问题,但是标准的01背包求的是最大价值,而此题是一个最小值问题,min(ans)>x max(ans')<∑Vi -x (ans'=∑vi-ans) 这样转化成一个最大值的问题,还有一个问题就是该题没有直接出现w [ i ] ,令w的意义为 v 此时问题与01背包问题完全等价。
(注:01背包问题状态转移方程是f [ j ] = max ( f [ j ],f [ j -v[ i ] ] + w [ i ] )
#include<bits/stdc++.h>
using namespace std;
int n,x;
const int N = 3e5 + 10;
int v[33],sum,f[N];
int main()
{
cin>>n>>x;
for (int i = 1;i <= n;i++)
{
cin >> v[i];
sum +=v[i];
}
int m = sum - x;//这是该问题中背包的容量
for (int i = 1;i <= n;i++)
for (int j = m;j >= v[i];j--)
f[j] = max(f[j], f[j - v[i]] + v[i]);
cout <<sum-f[m];
//system("pause");
}