还是回溯 #include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> using namespace std ; const int maxn = 23 ; struct Order { int s , d , num ; } order[maxn] ; int n , b , o , ans , vis[maxn] ; void init() { memset( order , 0 , sizeof( order ) ) ; memset( vis , 0 , sizeof( vis ) ) ; ans = 0 ; return ; } void input() { for( int i = 0 ; i < o ; ++i ) cin >> order[i].s >> order[i].d >> order[i].num ; return ; } bool is_ok( int x ) { for( int i = order[x].s ; i < order[x].d ; ++i ) { if( vis[i] + order[x].num > n ) { return false ; } } return true ; } void dfs( int cur , int tans ) { if( cur > o ) { if( tans > ans ) { ans = tans ; } return ; } if( is_ok( cur ) ) { for( int i = order[cur].s ; i < order[cur].d ; ++i ) vis[i] += order[cur].num ; dfs( cur+1 , tans+(order[cur].d-order[cur].s)*order[cur].num ) ; for( int i = order[cur].s ; i < order[cur].d ; ++i ) vis[i] -= order[cur].num ; } dfs( cur+1 , tans ) ; return ; } void solve() { dfs( 0 , 0 ) ; return ; } void output() { cout << ans << endl ; return ; } int main() { while( cin >> n >> b >> o && ( n ^ 0 ) ) { init() ; input() ; solve() ; output() ; } return 0 ; }