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;
}