题目链接
题意:
花费1:精灵球数量
花费2:皮卡丘体力值
价值:小精灵数量
收服每个小精灵需要部分精灵球数量和皮卡丘体力值;
问:收服尽可能多的精灵
精灵数相同时候,伤害最小
f[i,j,k]表示所有只从前i个物品中选,且花费1不超过j,花费2不超过k的选法的最大价值
转移方程;
f[i,j,k] = max(f[i-1, j, k], f[i-1, j-v1[i], k-v2[i] + 1)
可以优化掉一维 从大到小枚举
#include<iostream>
#include<algorithm>
#include<string.h>
const int N=1e4;
int f[N][N],v1[N],v2[N];
int n,m,k;
using namespace std;
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=k;i++) cin>>v1[i]>>v2[i];
for(int i=1;i<=k;i++)
for(int j=n;j>=v1[i];j--)
for(int k=m;k>=v2[i];k--)
f[j][k]=max(f[j][k],f[j-v1[i]][k-v2[i]]+1);
int ans;
for(ans=0;ans<=m;ans++) if(f[n][ans]==f[n][m]) break;
cout<<f[n][m]<<' '<<m-ans<<endl;
return 0;
}