dota都没落了,还出抢人头的题目。这是落后多少年呀。
主要思想,问题转换,将戴安娜射向其他的怪兽的子弹,存起来,到用的时候,再一起用了。
其他的就是DP了。
#include <cstdio>
#include <cstring>
using namespace std;
int T,N,P,Q;
int H[102],G[102];
int A[102],B[102];
int dp[102][2001];
inline int max(int a,int b){
return a>b?a:b;
}
int main(){
freopen("B-large-practice.in","r",stdin);
freopen("b.out","w",stdout);
scanf("%d",&T);
for(int cas=1; cas<=T; ++cas){
scanf("%d%d%d",&P,&Q,&N);
for(int i=1; i<=N; ++i){
scanf("%d%d",H+i,G+i);
}
for(int i=1; i<=N; ++i){
B[i]=H[i]/Q;
if(H[i]%Q==0){
B[i]--;
}
A[i]=(H[i]-Q*B[i])/P;
}
memset(dp,-1,sizeof(dp));
int c=0;
dp[0][1]=0;
for(int i=1; i<=N; ++i){
for(int j=0; j<2001; ++j){
if(dp[i-1][j]<0) continue;
int tmp2;
dp[i][j+B[i]+1]=dp[i-1][j]; //ignore i-th one
int tmp;
if(H[i]==A[i]*P+B[i]*Q)
tmp=0;
else
tmp=1;
if(j+B[i]-A[i]-tmp>=0) dp[i][j+B[i]-A[i]-tmp]=max(dp[i][j+B[i]-A[i]-tmp],dp[i-1][j]+G[i]); //get the i-th one
}
}
int ans=0;
for(int i=0; i<2001; ++i){
ans=max(ans,dp[N][i]);
}
printf("Case #%d: %d\n",cas,ans);
}
}