题目要求找最小的剩余空间,就是找最大的装箱空间,这题可以转化为一个简单的01背包
装任意个物品,使得总体积最大(同时要小于箱子的容量v)
对于每个物品,只有两种情况,装和不装
所以状态转移方程为dp[j]=max(dp[j],dp[j-w[i]]+w[i])
dp[j]为当容量为j时,所能装的最大体积
dp[j-w[i]]+w[i]为当容量为j时,放了第i件商品后能装的最大体积
代码
#include<bits/stdc++.h>
using namespace std;
int n,v,dp[50000],a[50],ans;
int main()
{
cin>>v>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)
{
for(int j=v;j>=a[i];j--)
{
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
}
cout<<v-dp[v];
return 0;
}