传送门:https://www.acwing.com/activity/content/16/
思路:两种体积:精灵球数量,皮卡丘体力值。价值:精灵数量
状态表示:f[i,j,k],在前i个物品当中,体积1的花费不超过j,体积2的花费不超过k的选择的最大收益。
状态转移方程:f[i,j,k]=max( f[i-1,j,k], f[i , j-v1[i] - v2[i]] +1 );
最小花费从后往前找到第一个不等于最大收益的状态的花费。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
#include<sstream>
using namespace std;
typedef long long LL;
int n,m,k;
const int N=1010;
int f[N][N];
int w[N];
int v[N];
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=k;i++)
cin>>v[i]>>w[i];
for(int i=1;i<=k;i++)
for(int j=n;j>=v[i];j--)
for(int p=m;p>w[i];p--)
f[j][p]=max(f[j][p],f[j-v[i]][p-w[i]]+1);
int i;
for(i=m-1;i>=1;i--)
{
if(f[n][m]!=f[n][i])
break;
}
cout<<f[n][m]<<' '<<m-i<<endl;
return 0;
}