題目連接:
http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1545
題目類型:
動態規劃 - 階段決策
數據結構:
struct LMIC_PROCE
{
int T1, T2, T3, F1, F2;
} * proce;
// 第 i 個階段, 剩餘容量 j;
int dmic[1200][1200] = { -1 };
思路分析:
------------------------------------------------------------------------
動態規劃 : 自頂向下 + 備忘錄
從終點開始往回搜索
每個階段可以進行選擇.
如果剩餘力氣大於F1
則可以進行 T1, T2, T3 選擇
否則,只能進行 T2,T3 選擇
源代碼:
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
struct LMIC_PROCE
{
int T1, T2, T3, F1, F2;
} * proce;
// 第 i 個階段, 剩餘容量 j;
int c, dmic[1200][1200] = { -1 };
int n, m;
int _min( int a, int b )
{
return a < b ? a : b;
}
int _min( int a, int b, int c )
{
int tmp = 1000;
if( a < tmp ) tmp = a;
if( b < tmp ) tmp = b;
if( c < tmp ) tmp = c;
return tmp;
}
int _dmic( int n, int f )
{
if( n < 1 )
{
dmic[n][f] = 0;
return dmic[n][f];
}
if( dmic[n][f] != -1 )
{
return dmic[n][f];
}
if( f >= proce[n - 1].F1 )
{
int left = _dmic( n - 1, f - proce[n - 1].F1 ) + proce[n - 1].T1;
int middle = _dmic( n - 1, f ) + proce[n - 1].T2;
int right = _dmic( n - 1, f + proce[n - 1].F2 >= m ? m : f + proce[n - 1].F2 ) + proce[n - 1].T3;
dmic[n][f] = _min( left, middle, right );
return dmic[n][f];
}
else
{
int left = _dmic( n - 1, f ) + proce[n - 1].T2;
int right = _dmic( n - 1, f + proce[n - 1].F2 >= m ? m : f + proce[n - 1].F2 ) + proce[n - 1].T3;
dmic[n][f] = _min( left, right );
return dmic[n][f];
}
}
int main()
{
int i, t;
scanf( "%d", &t );
while( t -- )
{
memset( dmic, -1, sizeof( dmic ) );
scanf( "%d%d", &n, &m );
proce = new LMIC_PROCE[ n + 1 ];
for( i = 0; i < n; i ++ )
{
scanf( "%d%d%d%d%d", &proce[i].T1, &proce[i].T2, &proce[i].T3, &proce[i].F1, &proce[i].F2 );
}
printf( "%d\n", _dmic( n, m ) );
}
return 0;
}