OJ-Problems-Source/HDOJ/5188_lvshubao1314.cpp

74 lines
1.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
hdu5188 有限制条件的01背包问题
题目大意有n道题i题用时ti秒得分vi在li时间点之前不能做出来而且一道题不能分开几次做一旦开始做必须在ti时间内把它做完
问得到w分的最小用时是多少
解题思路很像01背包的基本题但是有一个li分钟前不能AC的限制因此第i道题必须在最早第li-ti时刻做我们按照l-t递增排序然后按照经典解法来做
就行了
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
struct note
{
int t,v,l;
bool operator <(const note &other)const
{
return l-t<other.l-other.t;
}
}node[35];
int n,m;
int dp[3000005];
int main()
{
while(~scanf("%d%d",&n,&m))
{
int sum=0,ans=0,up=0;
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&node[i].t,&node[i].v,&node[i].l);
sum+=node[i].v;
ans+=node[i].t;
up=max(up,node[i].l);
}
if(m>sum)
{
printf("zhx is naive!\n");
continue;
}
sort(node,node+n);
up=max(up,ans);
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
for(int j=up;j>=node[i].l;j--)
{
if(j>=node[i].t)
{
dp[j]=max(dp[j],dp[j-node[i].t]+node[i].v);
}
}
}
int flag=0;
for(int i=0;i<=up;i++)
{
if(dp[i]>=m)
{
printf("%d\n",i);
flag=1;
break;
}
}
if(flag==0)
{
printf("zhx is naive!\n");
}
}
return 0;
}