mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
Create 5188_lvshubao1314.cpp
This commit is contained in:
parent
704dfb7975
commit
ca90f7c7d9
73
HDOJ/5188_lvshubao1314.cpp
Normal file
73
HDOJ/5188_lvshubao1314.cpp
Normal file
|
@ -0,0 +1,73 @@
|
|||
/**
|
||||
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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user