比较简单的一个DFS题,坑了我半天~
哎哎~
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int from;
int to;
int num;
int val;
bool operator <(const node &a)const
{
return val>a.val;
}
}o[23];
int tot,n,m,ans,sum[23],num[23];
void DFS(int index,int money)
{
if(index>=m)
{
ans=max(ans,money);
return;
}
if(money+sum[index]<ans)
return;
int i;
for(i=o[index].from;i<o[index].to;i++)
{
num[i]+=o[index].num;
if(num[i]>tot)
break;
}
if(i==o[index].to)
{
DFS(index+1,money+o[index].val);
i--;
}
for(;i>=o[index].from;i--)
num[i]-=o[index].num;
DFS(index+1,money);
}
int main()
{
while(scanf("%d%d%d",&tot,&n,&m)&&(tot+n))
{
ans=0;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&o[i].from,&o[i].to,&o[i].num);
o[i].val=o[i].num*(o[i].to-o[i].from);
}
sort(o,o+m);
for(int i=m-1;i>=0;i--)
sum[i]=o[i].val+sum[i+1];
DFS(0,0);
printf("%d\n",ans);
}
return 0;
}