解法
排序+01背包
这里的排序规则用q-p升序排列这里是一个感觉是一个贪心的策略,为什么这样做目前也无法有效的证明或者说出来
然后就是01背包加了一个体积必须大于什么值可以装那么加一个max(p,q)的条件即可
代码
#include <bits/stdc++.h>
using namespace std;
struct node
{
int p,q,w;
}num[1000];
bool cmp(node a,node b)
{
return a.q-a.p<b.q-b.p;
}
int dp[100000];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
while(cin>>n>>m)
{
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
cin>>num[i].p>>num[i].q>>num[i].w;
sort(num,num+n,cmp);
for(int i=0;i<n;i++)
for(int j=m;j>=max(num[i].p,num[i].q);j--)
dp[j]=max(dp[j],dp[j-num[i].p]+num[i].w);
cout<<dp[m]<<"\n";
}
}