很基础的背包问题,求解最优选择是v所剩最小,可以理解为在空间v的情况下,以1:1的价值比使价值最大。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include <stack>
#define LL long long
using namespace std;
const int N = 1e6 + 10;
int dp[31][20010],ite[31],n,v;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>v>>n;
for(int i=1;i<=n;i++){
cin>>ite[i];
}
sort(ite+1,ite+n+1);
for(int i=1;i<=n;i++){
for(int j=1;j<=v;j++){
if (j<ite[i])dp[i][j]=dp[i-1][j];
else if(dp[i][j]<dp[i-1][j-ite[i]]+ite[i])
dp[i][j]=max(dp[i-1][j-ite[i]]+ite[i],dp[i-1][j]);
}
}
cout<<v-dp[n][v];
return 0;
}
//优化:
int dp[20010],ite[31],n,v;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>v>>n;
for(int i=1;i<=n;i++){
cin>>ite[i];
}
sort(ite+1,ite+n+1);
for(int i=1;i<=n;i++){
for(int j=v;j>=ite[i];j--){
if(dp[j]<dp[j-ite[i]]+ite[i])
dp[j]=dp[j-ite[i]]+ite[i];
}
}
cout<<v-dp[v];
return 0;
}