a在上面b在下面->a.v-M-b.m>b.v-M-a.m->剩余率大
所以我先遍历a,让a在上面
这就是要考虑贪心排序的01背包
因为它有放的限制条件


#include<bits/stdc++.h>
using namespace std;
#define N 100011
typedef long long ll;
typedef pair<ll,int> pii;
int dp[20011+20];
struct zh{int w,v;
}a[1005];
int n;
bool cmp(struct zh a,struct zh b)///a在上面b在下面->a.v-M-b.m>b.v-M-a.m->剩余率大///所以我先遍历a,让a在上面///这就是要考虑贪心排序的01背包///因为它有放的限制条件
{return a.v+a.w<b.v+b.w;
}
int ma;
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i].w>>a[i].v;
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{for(int v=a[i].v+a[i].w;v>=a[i].w;v--){dp[v]=max(dp[v],dp[v-a[i].w]+a[i].v);///后者是选了这块,v-a[i].w是上面的砖要不超过///a[i].v ma=max(ma,dp[v]);}
}
cout<<ma;
}