解题思路:
本题是01背包问题的变化形式,只需要将最少删去多少本书使价格任然超过x,转换成最多删除多少本书,使删去的书本价格不超过sum-x即可。一本书只有拿与不拿两种选择。
01背包核心公式:
op[i][j]=op[i-1][j]
op[i][j]=max(op[i][j],op[i-1][j-price[i]]+price[i])
#include<bits/stdc++.h>
using namespace std;
int price[40]; //存储每本书的价格
int op[40][300005]; //动态规划数组
int main()
{
int n,x;
cin>>n>>x;
int sum0=0;
for(int i=1;i<=n;i++)
{
cin>>price[i];
sum0+=price[i]; //计算书本总价值
}
int sum=sum0-x; //转换问题为:最多删去多少本书,删去书本的价值总和不能超过sum,01背包问题
for(int i=1;i<=n;i++)
{
for(int j=1;j<=sum;j++)
{
op[i][j]=op[i-1][j];
if(j>=price[i]) op[i][j]=max(op[i][j],op[i-1][j-price[i]]+price[i]); //背包问题核心代码
}
}
cout<<(sum0-op[n][sum]);
return 0;
}