J: 搬砖 —— 参考地址
这是一个经典的01背包+贪心的问题,在 洛谷 AT4545 Tower 中可以找到几乎类似的原题,以及在 算法竞赛进阶指南的AcWing 125. 耍杂技的牛 可以找到相同思想的题。
#include<bits/stdc++.h>
using namespace std;
const int N = 1010,M = 20100;
int dp[M];
struct Node {
int w,v;
} a[N];
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].w>>a[i].v;
sort(a+1,a+n+1,[&](Node A,Node B) {
return A.w+A.v<B.w+B.v;
});
memset(dp,-0x3f,sizeof dp);
dp[0]=0;
for(int i=1;i<=n;i++)
for(int j=a[i].w+a[i].v;j>=a[i].w;j--)
dp[j]=max(dp[j],dp[j-a[i].w]+a[i].v);
cout<<*max_element(dp,dp+20000)<<endl;
return 0;
}