回溯,注意这个题是一个方向走的,不回头。写了两份代码,第一份WA,换了种思路,第二份AC了,都贴出来,以后再研究研究。
/**
WA
*/
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX_N = 22 + 5;
int m,n,c;
struct order
{
int start,end,num;
};
int cmp(order a,order b)
{
return a.start < b.start;
}
order o[MAX_N];
int vis[MAX_N];
int _max;
void dfs(int x,int p_num,int money)
{
int i,j;
for(i = x;i < n;i++)
{
if(i != 0 && o[i-1].start != o[i].start)
{
for(j = i - 1;j >= 0;j--)
if(o[j].end == o[i].start && vis[j])
p_num -= o[j].num;//到站了下车
}
p_num += o[i].num;
if(p_num > c)
{
p_num -= o[i].num;
continue;
}
money = money + (o[i].end - o[i].start) * o[i].num;//先收钱
vis[i] = 1;
dfs(i+1,p_num,money);
vis[i] = 0;
p_num -= o[i].num;
money = money - (o[i].end - o[i].start) * o[i].num;
}
if(money > _max)
_max = money;
}
int main()
{
while(cin>>c>>m>>n && (c || m || n))
{
_max = 0;
memset(vis,0,sizeof(vis));
memset(o,0,sizeof(o));
int i;
for(i = 0;i < n;i++)
cin>>o[i].start>>o[i].end>>o[i].num;
sort(o,o+n,cmp);
dfs(0,0,0);
cout<<_max<<endl;
}
return 0;
}
/**
AC
*/
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX_N = 22 + 5;
const int MAX_M = 7 + 3;
int m,n,c;
struct order
{
int start,end,num;
};
order o[MAX_N];
int station[MAX_M];
int _max;
void dfs(int x,int money)
{
int i,j;
for(i = x;i < n;i++)
{
for(j = o[i].start;j < o[i].end;j++)
{
station[j] += o[i].num;
if(station[j] > c)
break;
}
if(j == o[i].end)
{
dfs(i+1,money+(o[i].end-o[i].start)*o[i].num);
j--;
}
for(;j >= o[i].start;j--)
station[j] -= o[i].num;
}
if(money > _max)
_max = money;
}
int main()
{
while(cin>>c>>m>>n && (c || m || n))
{
_max = 0;
memset(o,0,sizeof(o));
memset(station,0,sizeof(station));
int i;
for(i = 0;i < n;i++)
cin>>o[i].start>>o[i].end>>o[i].num;
dfs(0,0);
cout<<_max<<endl;
}
return 0;
}