传送门
分析
这转化,真是够可以的
首先我们需要得出一个结论:无论我们怎么选,最后肯定都有一种选法满足条件(证明的话,感性理解一下,假设我们现在知道最后打出去的牌是哪些,那我们一定可以调整打牌的顺序,使其满足条件)
然后在此基础上我们就可以直接使用0/1背包
将伤害值看做是原牌的价值,魔法值看做是原牌的体积
代码
#include<bits/stdc++.h>
#define in read()
#define N 100009
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n,m;
int val[N],c[N],f[N];
int main(){
n=in;
int i,j,k;
for(i=1;i<=n;++i){
val[i]=in;c[i]=in;
}
for(i=1;i<=n;++i)
for(j=n;j>=c[i];--j)
f[j]=max(f[j],f[j-c[i]]+val[i]);
int ans=-1;
for(i=1;i<=n;++i)
ans=max(ans,f[i]);
cout<<ans;
return 0;
}