https://ac.nowcoder.com/acm/problem/15030
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e3+10;
const int inf=0x3f3f3f3f;
int dp[maxn],v[maxn],w[maxn];
//01背包
//最初想法为背包+记录,回溯判断背包满不满,然后再抓剩下的一个威力最大的装备。
//但是仔细想想,这样的话,拿的装备是威力相对较大,且重量也较大的,但是这没法分辨,所以需要全部遍历。
//由于数据很小,所以枚举拿每一种装备时的可能性。
int main(){
int n,m,h;
while(cin>>n>>m>>h){
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
dp[0]=0;
int mx=-inf;
for(int k=1;k<=n;k++){ //枚举装备没满时候,固定拿的一件装备
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++) //01背包
for(int j=m+h;i!=k&&j>=v[i];j--)
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
if(h) mx=max(dp[h+m-1]+w[k],mx); //当装备未满,最大空间为m+h-1,此时拿一件装备,但是h=0情况,仍会出现未满情况,但不可以拿装备
else mx=max(dp[m+h],mx); //但是h=0情况,仍会出现未满情况,但不可以拿装备。(当装备满,空间为m+h。)
}
cout<<mx<<endl;
}
}