题目分析:题目搞不懂呀,,参考了,http://blog.csdn.net/kyle_once/article/details/6198468,
才弄明白,一直把离校时间,理解错了....吧bg当做物品,欢乐度当做价值,持续时间当做体积,离校时间当做容量,放入顺序是有顺序的,要按离校时间升序排序,
定义dp[i][j],为吧前件bg安排到j时间内,所获得的最大欢乐度,
dp[i][j]=max(dp[i-1][j],dp[i-1][j-arr[i].l]+arr[i].h); 并且 arr[i].l<=j&&j<=arr[i].t
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
int h,l,t;
}arr[35];
int dp[1000];//dp[i][j]把前i个bg安排到j时间内的最大欢乐度
int cmp(node x,node y)
{
return x.t<y.t;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n<0)
break;
for(int i=1;i<=n;i++)
scanf("%d %d %d",&arr[i].h,&arr[i].l,&arr[i].t);
sort(arr+1,arr+1+n,cmp);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=arr[n].t;j>=arr[i].l;j--)
if(j>=arr[i].l&&j<=arr[i].t)
dp[j]=max(dp[j],dp[j-arr[i].l]+arr[i].h);
int ans=0;
for(int i=1;i<=arr[n].t;i++)
if(dp[i]>ans)
ans=dp[i];
printf("%d\n",ans);
}
system("pause");
return 0;
}
还可用不优化空间复杂度,用二维的做:
/****不压缩空间*****/
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
int h,l,t;
}arr[35];
int dp[1000][1000];//dp[i][j]把前i个bg安排到j时间内的最大欢乐度
int cmp(node x,node y)
{
return x.t<y.t;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n<0)
break;
for(int i=1;i<=n;i++)
scanf("%d %d %d",&arr[i].h,&arr[i].l,&arr[i].t);
sort(arr+1,arr+1+n,cmp);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=1;j<=arr[n].t;j++) //(int j=arr[n].t;j>=arr[i].l;j--)
if(j>=arr[i].l&&j<=arr[i].t && dp[i-1][j-arr[i].l]+arr[i].h>dp[i-1][j])
dp[i][j]=dp[i-1][j-arr[i].l]+arr[i].h;
//dp[i][j]=max(dp[i-1][j],dp[i-1][j-arr[i].l]+arr[i].h);
else
dp[i][j]=dp[i-1][j];
int ans=0;
for(int i=1;i<=arr[n].t;i++)
if(dp[n][i]>ans)
ans=dp[n][i];
printf("%d\n",ans);
}
system("pause");
return 0;
}
这个搜索模式和hdu1248 寒冰王座 一样的........不懂,参考别人的!!!!
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
int h,l,t;
}arr[35];
int ans,n;
int cmp(node x,node y)
{
return x.t<y.t;
}
void dfs(int i,int h,int t)//i代表搜到第i个bg,h代表当前的欢乐度,t代表当前的截止时间
{
if(ans<h)
ans=h;
if(i>n)
return ;
dfs(i+1,h,t);
if(t+arr[i].l<=arr[i].t)
dfs(i+1,h+arr[i].h,t+arr[i].l);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n<0)
break;
for(int i=1;i<=n;i++)
scanf("%d %d %d",&arr[i].h,&arr[i].l,&arr[i].t);
sort(arr+1,arr+1+n,cmp);
ans=0;
dfs(1,0,0);
printf("%d\n",ans);
}
system("pause");
return 0;
}