对动态规划不懂,借此记住
01背包问题
虽然是入门级,但是也做了好久~
#include <iostream>
using namespace std;
int drug[ 102 ][ 1002 ];
int main()
{
int time, size, i;
int t[ 101 ], v[ 101 ];
cin >> time >> size;
for( i = 0; i < size; i++ )
cin >> t[ i ] >> v[ i ];
for( i = 0; i <= time; i++ ) // 点之后的都为0
drug[ size ][ i ] = 0;
int j;
for( i = size - 1; i >= 0; i-- ) // 遍历所有点
{
for( j = 0; j <= time; j++ ) // 遍历所有可能剩余空间
{
if( j < t[ i ] ) // 当剩余空间不支持添加当前点
drug[ i ][ j ] = drug[ i + 1 ][ j ];
else // 当剩余空间足够大可以支持当前点
{
if( drug[ i + 1 ][ j ] < drug[ i + 1 ][ j - t[ i ] ] + v[ i ] ) // 如果加上该点后能比原来的大
drug[ i ][ j ] = drug[ i + 1 ][ j - t[ i ] ] + v[ i ];
else
drug[ i ][ j ] = drug[ i + 1 ][ j ];
}
}
}
int max;
max = 0;
for( i = 0; i <= time; i++ )
if( drug[ 0 ][ i ] > max )
max = drug[ 0 ][ i ];
cout << max << endl;
return 0;
}