题目链接
题意:
花费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;
}

 posted on 2020-01-19 22:04  谁是凶手1703  阅读(54)  评论(0)    收藏  举报