代码如下————
#include <bits/stdc++.h>
using namespace std;
int dp[10001]={0};//dp数组,dp[i]表示预算不超过i时所能达到的最大攻击力
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);//取消同步流,加快输入速度
int n,m,B;
cin>>n>>m>>B;
int *attack=(int *)malloc(sizeof(int)*(n+2));
int *cost=(int *)malloc(sizeof(int)*(n+2));
int *enemy=(int *)malloc(sizeof(int)*(m+2));
for(int i=0;i<n;i++)//输入干员信息
{
cin>>attack[i]>>cost[i];
}
for(int i=0;i<n;i++)//对每个干员
{
for(int j=B;j>=cost[i];j--)//从后往前遍历预算的每一个可能的值,范围为[cost[i],B]
{
dp[j]=max(dp[j],dp[j-cost[i]]+attack[i]);//对每一个干员,可以选择其出战,也可以不选择其出战,
//不选择则为dp[j],选择则为dp[j-cost[i]]+attack[i],此时预算减去cost[i],de[j]加上attack[i]
//cout<<"i = "<<i<<", dp["<<j<<"] = "<<dp[j]<<endl; //可观测执行每一步dp[j]的值
}
}
int max_enemy=0;//记录敌人的最高血量
for(int i=0;i<m;i++)
{
cin>>enemy[i];//输入敌人的血量信息
if(enemy[i]>max_enemy)max_enemy=enemy[i];//记录最大值
}
int max_attack=dp[B];//dp[B]即为预算为B时所能达到的最大攻击力
if(max_attack==0)//若为0说明不可能击败敌人
{
cout<<-1<<endl;
return 0;
}
int rounds=(int)ceil((double)max_enemy/max_attack);//轮数为最高血量除以最大攻击力向上取整
cout<<rounds<<endl;
return 0;
}
水一题庆祝找回账号