Re0:DP学习之路 Proud Merchants HDU - 3466

解法

排序+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";
  }
}
posted @ 2019-01-07 11:29  baccano!  阅读(142)  评论(0编辑  收藏  举报