#include<bits/stdc++.h>
#include<fstream>
#define fi(i,a,b) for(int i=(a);i<(b);i++)
#define fd(i,a,b) for(int i=(a);i>(b);--i)
#define infy 1e8
#define llu long long
using namespace :: std ;
typedef vector < int > vi; //The following operations are defined for iterators: get value of an iterator, int x = *it; , increment and decrement iterators it1++, it2--; , compare iterators by '!=' and by '<' , add an immediate to iterator it += 20; <=> shift 20 elements forward , get the distance between iterators, int n = it2-it1; , Not only can they operate on any container, they may also perform, for example, range checking and profiling of container usage.
//The type of iterator can be constructed by a type of container by appending “::iterator”, “::const_iterator”, “::reverse_iterator” or “::const_reverse_iterator” to it. use '!=' instead of '<', and 'empty()' instead of 'size() != 0' -- for some container types, it’s just very inefficient to determine which of the iterators precedes another.
typedef vector< vi> vvi; //vector< vector<int> > Matrix(N, vector<int>(M, -1));
typedef pair < int , int > ii; //Pairs are compared first-to-second element. If the first elements are not equal, the result will be based on the comparison of the first elements only; the second elements will be compared only if the first ones are equal. The array (or vector) of pairs can easily be sorted by STL internal functions.(convex hull - For example, if you want to sort the array of integer points so that they form a polygon, it’s a good idea to put them to the vector< pair<double, pair<int,int> >, where each element of vector is { polar angle, { x, y } }. One call to the STL sorting function will give you the desired order of points. )
typedef vector < ii > vii;
typedef vector < vii> vvii;
vector< int > o( 22 , infy - 1 ) ;
vector < vector < int > > ausi( 81 , o) ;
vector< vector < vector< int > > > dp( 2 , ausi) ;
vector< llu> oc( 1000 , 0 ) , nc( 1000 , 0 ) , wc( 1000 , 0 ) ;
llu f( int i, int j, int cyls, int n)
{
if ( i <= 0 && j <= 0 ) return 0 ; /** no requirement of oxygen or nitrogen **/
if ( i >= 0 && j >= 0 && dp[ n] [ i] [ j] ! = infy - 1 ) return dp[ n] [ i] [ j] ; /** result already calculated**/
else if ( ( ( i > 0 && j <= 0 ) || ( i <= 0 && j > 0 ) ) && cyls == 0 ) return infy; /**if either some oxygen is req or some nitrogen but no of cylinders left is zero, cost is infy**/
else
{
if ( ( i <= 0 || j <= 0 ) && cyls > 0 ) return ( min( wc[ cyls- 1 ] + f( i - oc[ cyls- 1 ] , j - nc[ cyls- 1 ] , cyls - 1 , ! n) , f( i, j, cyls- 1 , ! n) ) ) ; /**if any of i, j, n is -ve, simply calcluate f() for this case, as we cant access dp[][][] for it**/
if ( ( i > 0 && j > 0 ) && cyls == 0 ) dp[ n] [ i] [ j] = infy; /** if dp[n][i][j] hasnt been calculated yet, ...., fisrt three conditions check that we dont access any negative indices**/
else /**includes the case when one gas requirement is +ve, while odr is -ve **/
{
int temp = min( wc[ cyls- 1 ] + f( i - oc[ cyls- 1 ] , j - nc[ cyls- 1 ] , cyls - 1 , ! n) , f( i, j, cyls- 1 , ! n) ) ;
if ( i >= 0 && j >= 0 && n >= 0 ) { dp[ n] [ i] [ j] = temp; /*cout<<cyls<<' '<<n<<' '<<i<<' '<<j<<' '<<dp[n][i][j]<<endl; */ return temp; }
else { /*cout<<cyls<<' '<<n<<' '<<i<<' '<<j<<' '<<temp<<endl; */ return temp; }
}
}
// cout<<cyls<<' '<<n<<' '<<i<<' '<<j<<' '<<dp[n][i][j]<<endl;
return dp[ n] [ i] [ j] ;
}
void set_dp( int n)
{
dp[ n] = ausi;
dp[ 0 ] [ 0 ] [ 0 ] = 0 ;
}
int main( )
{
// freopen("in.txt", "r", stdin);
int t, O, N, cylinders, n = 1 ;
cin >> t;
while ( t-- )
{
dp = vector< vector < vector< int > > > ( 2 , ausi) ;
dp[ 0 ] [ 0 ] [ 0 ] = 0 ;
n = 1 ;
cin >> O>> N;
cin >> cylinders;
fi( i, 0 , cylinders)
cin >> oc[ i] >> nc[ i] >> wc[ i] ;
// cout<<"cs n i j dp"<<endl;
fi( cyls, 1 , cylinders+ 1 )
{
fi( i, 0 , O+ 1 )
fi( j, 0 , N+ 1 )
f( i, j, cyls, n) ;
n = ! n;
set_dp( n) ;
}
n = ! n;
cout << dp[ n] [ O] [ N] << endl;
//n = !n;
//cout<<dp[n][O][N]<<endl<<n;
}
return 0 ;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2luY2x1ZGU8ZnN0cmVhbT4KI2RlZmluZSBmaShpLGEsYikgZm9yKGludCBpPShhKTtpPChiKTtpKyspCiNkZWZpbmUgZmQoaSxhLGIpIGZvcihpbnQgaT0oYSk7aT4oYik7LS1pKQojZGVmaW5lIGluZnkgMWU4CiNkZWZpbmUgbGx1ICBsb25nIGxvbmcKCnVzaW5nIG5hbWVzcGFjZTo6c3RkOwoKdHlwZWRlZiB2ZWN0b3IgPGludD4gdmk7CS8vVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSBkZWZpbmVkIGZvciBpdGVyYXRvcnM6IGdldCB2YWx1ZSBvZiBhbiBpdGVyYXRvciwgaW50IHggPSAqaXQ7ICwgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgaXRlcmF0b3JzIGl0MSsrLCBpdDItLTsgLCBjb21wYXJlIGl0ZXJhdG9ycyBieSAnIT0nIGFuZCBieSAnPCcgLCBhZGQgYW4gaW1tZWRpYXRlIHRvIGl0ZXJhdG9yIGl0ICs9IDIwOyA8PT4gc2hpZnQgMjAgZWxlbWVudHMgZm9yd2FyZCAsIGdldCB0aGUgZGlzdGFuY2UgYmV0d2VlbiBpdGVyYXRvcnMsIGludCBuID0gaXQyLWl0MTsgLCAgTm90IG9ubHkgY2FuIHRoZXkgb3BlcmF0ZSBvbiBhbnkgY29udGFpbmVyLCB0aGV5IG1heSBhbHNvIHBlcmZvcm0sIGZvciBleGFtcGxlLCByYW5nZSBjaGVja2luZyBhbmQgcHJvZmlsaW5nIG9mIGNvbnRhaW5lciB1c2FnZS4KCQkJCS8vVGhlIHR5cGUgb2YgaXRlcmF0b3IgY2FuIGJlIGNvbnN0cnVjdGVkIGJ5IGEgdHlwZSBvZiBjb250YWluZXIgYnkgYXBwZW5kaW5nIOKAnDo6aXRlcmF0b3LigJ0sIOKAnDo6Y29uc3RfaXRlcmF0b3LigJ0sIOKAnDo6cmV2ZXJzZV9pdGVyYXRvcuKAnSBvciDigJw6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3LigJ0gdG8gaXQuIHVzZSAnIT0nIGluc3RlYWQgb2YgJzwnLCBhbmQgJ2VtcHR5KCknIGluc3RlYWQgb2YgJ3NpemUoKSAhPSAwJyAtLSBmb3Igc29tZSBjb250YWluZXIgdHlwZXMsIGl04oCZcyBqdXN0IHZlcnkgaW5lZmZpY2llbnQgdG8gZGV0ZXJtaW5lIHdoaWNoIG9mIHRoZSBpdGVyYXRvcnMgcHJlY2VkZXMgYW5vdGhlci4KdHlwZWRlZiB2ZWN0b3I8dmk+IHZ2aTsJCS8vdmVjdG9yPCB2ZWN0b3I8aW50PiA+IE1hdHJpeChOLCB2ZWN0b3I8aW50PihNLCAtMSkpOwp0eXBlZGVmIHBhaXIgPCBpbnQsIGludCA+IGlpOwkvL1BhaXJzIGFyZSBjb21wYXJlZCBmaXJzdC10by1zZWNvbmQgZWxlbWVudC4gSWYgdGhlIGZpcnN0IGVsZW1lbnRzIGFyZSBub3QgZXF1YWwsIHRoZSByZXN1bHQgd2lsbCBiZSBiYXNlZCBvbiB0aGUgY29tcGFyaXNvbiBvZiB0aGUgZmlyc3QgZWxlbWVudHMgb25seTsgdGhlIHNlY29uZCBlbGVtZW50cyB3aWxsIGJlIGNvbXBhcmVkIG9ubHkgaWYgdGhlIGZpcnN0IG9uZXMgYXJlIGVxdWFsLiBUaGUgYXJyYXkgKG9yIHZlY3Rvcikgb2YgcGFpcnMgY2FuIGVhc2lseSBiZSBzb3J0ZWQgYnkgU1RMIGludGVybmFsIGZ1bmN0aW9ucy4oY29udmV4IGh1bGwgLSBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gc29ydCB0aGUgYXJyYXkgb2YgaW50ZWdlciBwb2ludHMgc28gdGhhdCB0aGV5IGZvcm0gYSBwb2x5Z29uLCBpdOKAmXMgYSBnb29kIGlkZWEgdG8gcHV0IHRoZW0gdG8gdGhlIHZlY3RvcjwgcGFpcjxkb3VibGUsIHBhaXI8aW50LGludD4gPiwgd2hlcmUgZWFjaCBlbGVtZW50IG9mIHZlY3RvciBpcyB7IHBvbGFyIGFuZ2xlLCB7IHgsIHkgfSB9LiBPbmUgY2FsbCB0byB0aGUgU1RMIHNvcnRpbmcgZnVuY3Rpb24gd2lsbCBnaXZlIHlvdSB0aGUgZGVzaXJlZCBvcmRlciBvZiBwb2ludHMuICkKdHlwZWRlZiB2ZWN0b3IgPCBpaSA+IHZpaTsKdHlwZWRlZiB2ZWN0b3IgPHZpaT4gdnZpaTsKCnZlY3RvcjxpbnQ+IG8oMjIsIGluZnkgLSAxKTsKdmVjdG9yIDwgdmVjdG9yIDxpbnQ+ID5hdXNpKDgxLCBvKTsKdmVjdG9yPHZlY3RvciA8IHZlY3RvcjxpbnQ+ID4gPiBkcCgyLCBhdXNpKTsKdmVjdG9yPGxsdT4gb2MoMTAwMCwgMCksIG5jKDEwMDAsIDApLCB3YygxMDAwLCAwKTsKCmxsdSBmKGludCBpLCBpbnQgaiwgaW50IGN5bHMsIGludCBuKQp7CiAgICBpZihpIDw9IDAgJiYgaiA8PTApIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBubyByZXF1aXJlbWVudCBvZiBveHlnZW4gb3Igbml0cm9nZW4gKiovCiAgICBpZihpID49IDAgJiYgaiA+PSAwICYmIGRwW25dW2ldW2pdICE9IGluZnkgLTEpIHJldHVybiBkcFtuXVtpXVtqXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogcmVzdWx0IGFscmVhZHkgY2FsY3VsYXRlZCoqLwogICAgZWxzZSBpZigoIChpID4gMCAmJiBqIDw9IDApfHwoaSA8PSAwICYmIGogPiAwKSApICYmIGN5bHMgPT0gMCApIHJldHVybiBpbmZ5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKippZiBlaXRoZXIgc29tZSBveHlnZW4gaXMgcmVxIG9yIHNvbWUgbml0cm9nZW4gYnV0IG5vIG9mIGN5bGluZGVycyBsZWZ0IGlzIHplcm8sIGNvc3QgaXMgaW5meSoqLwogICAgZWxzZQogICAgewogICAgICAgIGlmKCAoaSA8PSAwIHx8IGogPD0gMCApICYmIGN5bHMgPjApIHJldHVybiAobWluKHdjW2N5bHMtMV0gKyBmKGkgLSBvY1tjeWxzLTFdLCBqIC0gbmNbY3lscy0xXSwgY3lscyAtIDEsICFuKSwgZihpLCBqLCBjeWxzLTEsICFuKSkgKTsvKippZiBhbnkgb2YgaSwgaiwgbiBpcyAtdmUsIHNpbXBseSBjYWxjbHVhdGUgZigpIGZvciB0aGlzIGNhc2UsIGFzIHdlIGNhbnQgYWNjZXNzIGRwW11bXVtdIGZvciBpdCoqLwogICAgICAgIGlmKChpID4gMCAmJiBqID4gMCkgJiYgY3lscyA9PSAwKSBkcFtuXVtpXVtqXSA9IGluZnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBpZiBkcFtuXVtpXVtqXSBoYXNudCBiZWVuIGNhbGN1bGF0ZWQgeWV0LCAuLi4uLCBmaXNydCB0aHJlZSBjb25kaXRpb25zIGNoZWNrIHRoYXQgd2UgZG9udCBhY2Nlc3MgYW55IG5lZ2F0aXZlIGluZGljZXMqKi8KICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKmluY2x1ZGVzIHRoZSBjYXNlIHdoZW4gb25lIGdhcyByZXF1aXJlbWVudCBpcyArdmUsIHdoaWxlIG9kciBpcyAtdmUgKiovCiAgICAgICAgewoKICAgICAgICAgICAgaW50IHRlbXAgID0gbWluKHdjW2N5bHMtMV0gKyBmKGkgLSBvY1tjeWxzLTFdLCBqIC0gbmNbY3lscy0xXSwgY3lscyAtIDEsICFuKSwgZihpLCBqLCBjeWxzLTEsICFuKSk7CiAgICAgICAgICAgIGlmKGkgPj0gMCAmJiBqID49IDAgJiYgbiA+PSAwKSB7IGRwW25dW2ldW2pdID0gdGVtcDsgLypjb3V0PDxjeWxzPDwnICc8PG48PCcgJzw8aTw8JyAnPDxqPDwnICc8PGRwW25dW2ldW2pdPDxlbmRsOyAqL3JldHVybiB0ZW1wOyB9CiAgICAgICAgICAgIGVsc2UgeyAvKmNvdXQ8PGN5bHM8PCcgJzw8bjw8JyAnPDxpPDwnICc8PGo8PCcgJzw8dGVtcDw8ZW5kbDsgKi9yZXR1cm4gdGVtcDsgfQogICAgICAgIH0KICAgIH0KLy8gICAgY291dDw8Y3lsczw8JyAnPDxuPDwnICc8PGk8PCcgJzw8ajw8JyAnPDxkcFtuXVtpXVtqXTw8ZW5kbDsKICAgIHJldHVybiBkcFtuXVtpXVtqXTsKCn0Kdm9pZCBzZXRfZHAoaW50IG4pCnsKICAgIGRwW25dID0gYXVzaTsKICAgIGRwWzBdWzBdWzBdID0gMDsKfQppbnQgbWFpbigpCnsKLy8gICBmcmVvcGVuKCJpbi50eHQiLCAiciIsIHN0ZGluKTsKICBpbnQgdCwgTywgTiwgY3lsaW5kZXJzLCBuID0gMTsKICBjaW4+PnQ7CgogIHdoaWxlKHQtLSkKICB7CiAgICAgIGRwID0gdmVjdG9yPHZlY3RvciA8IHZlY3RvcjxpbnQ+ID4gPiAoMiwgYXVzaSk7CiAgICAgIGRwWzBdWzBdWzBdID0gMDsKICAgICAgbiAgPSAxOwoKICAgICAgY2luPj5PPj5OOwogICAgICBjaW4+PmN5bGluZGVyczsKICAgICAgZmkoaSwgMCwgY3lsaW5kZXJzKQogICAgICBjaW4+Pm9jW2ldPj5uY1tpXT4+d2NbaV07CgovLyAgICAgICAgY291dDw8ImNzICBuICBpICBqICBkcCI8PGVuZGw7CiAgICAgIGZpKGN5bHMsIDEsIGN5bGluZGVycysxKQogICAgICB7CiAgICAgICAgICAgIGZpKGksIDAsIE8rMSkKICAgICAgICAgICAgZmkoaiwgMCwgTisxKQogICAgICAgICAgICBmKGksIGosIGN5bHMsIG4pOwogICAgICAgICAgICBuID0gIW47CiAgICAgICAgICAgIHNldF9kcChuKTsKICAgICAgfQpuID0gIW47CmNvdXQ8PGRwW25dW09dW05dPDxlbmRsOwovL24gPSAhbjsKLy9jb3V0PDxkcFtuXVtPXVtOXTw8ZW5kbDw8bjsKICB9CgpyZXR1cm4gMDsKfQo=