找啊找啊找GF 题解

具体题目及提交:http://www.rqnoj.cn/Problem_57.html

 

题目大意:

现在找GF需要花钱,花RP,还要花时间。现在有n个女孩,给出她们需要花费的钱,RP,时间。求出在保证mm最多的情况下用的时间最少。

 

这一题的时间是一个干扰条件。如果先不看时间,要你求出最多能搞到多少个mm,很明显的二维费用背包。现在多了个时间,但是它是不是多个费用呢?不是!

 

题目给我们的限制是只有一定的钱和rp,而对于时间只是说希望尽量少。所以时间并不影响我们往背包里放物品。而是在找的GF一样多的时候希望时间尽量的少。

 

看方程。F[i][a][b]表示前i个女孩,有a的钱和b的人品能够找到的最多的MM数量。C[i][a][b]表示前i个女孩,有a的钱和b的人品在保证找到的MM数量最多的情况下用的最少的时间。显然,C是依赖于F的。

 

F[i][a][b] = max{  F[i-1][a][b] , F[i-1][a-m[i]][b-r[i]] + 1 }

 

if( F[i-1][a][b] > F[i-1][a-m[i]][b-r[i]] + 1 )

    C[i][a][b] = C[i-1][a][b];

else if( F[i-1][a][b] < F[i-1][a-m[i]][b-r[i]] + 1 )

    C[i][a][b] = C[i-1][a-m[i]][b-r[i]] + time[i];

else

    C[i][a][b] = min{ C[i-1][a][b],C[i-1][a-m[i]][b-r[i]] + time[i] }

 

#include using namespace std; int _gDp[101][101]; //money rp int _gCostTime[101][101]; int _gMoney[101],_gRp[101],_gTime[101]; inline int _fMin( int a,int b ) { return a> n; for( int i = 1;i <= n;++i ) cin >> _gMoney[i] >> _gRp[i] >> _gTime[i]; cin >> m >> r; for( int i = 0;i <= m;++i ) { for( int j = 0;j <= r;++j ) { _gDp[i][j] = 0; _gCostTime[i][j] = 0; } } int temp; for( int i = 1;i <= n;++i ) { for( int money = m;money > 0;--money ) { if( money - _gMoney[i] < 0 ) break; for( int rp = r;rp > 0;--rp ) { if( rp - _gRp[i] < 0 ) break; temp = _gDp[ money - _gMoney[i] ][ rp - _gRp[i] ] + 1; if( temp > _gDp[money][rp] ) { _gDp[money][rp] = temp; _gCostTime[money][rp] = _gCostTime[ money - _gMoney[i] ][ rp - _gRp[i] ] + _gTime[i]; } else if( temp < _gDp[money][rp] ) ; else // == _gCostTime[money][rp] = _fMin( _gCostTime[ money - _gMoney[i] ][ rp - _gRp[i] ] + _gTime[i],_gCostTime[money][rp] ); } } } cout << _gCostTime[m][r] << endl; //system("pause"); return 0; }  

你可能感兴趣的:(动态规划)