题目链接 http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=1028
01背包题目
状态转移方程 Max[j]=max(Max[j],Max[data[i].s-1]+data[i].val)
代码如下
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
struct work
{
int s;
int e;
int val;
} data[1005];
int cmp(const work&a,const work&b)
{
if(a.s!=b.s) return a.s<b.s;
else return a.e<b.e;
}
int main()
{
int T;
int m,n;
int Max[105];
scanf("%d",&T);
while(T--)
{
memset(Max,0,sizeof(Max));
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&data[i].s,&data[i].e,&data[i].val);
int j=0;
sort(data+1,data+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(data[i].e<=m)
{
j=data[i].e;
Max[j]=max(Max[j],Max[data[i].s-1]+data[i].val);
for(int k=j+1;k<=m;k++)//由于不一定正好放假的所有天都有工作可做 所以每次对第i件可行工作进行处理后 Max 要随之刷到最后
Max[k]=max(Max[k],Max[j]);//******注意此处的大小比较
}
}
/*
for(int i=1;i<=m;i++)
{
if(i!=m) cout<<Max[i]<<" ";
else
cout<<Max[i]<<endl;
}
*/
printf("%d\n",Max[m]);
}
return 0;
}