题目:银行有多种储蓄方案,你有n元,要存y年,安排储蓄方案使得总利息最大。
分析:dp,完全背包。每次背包的容量,用新的最大价更新值代替即可,即 V += F[ V ]。
说明:把百度空间的题解搬过来(⊙_⊙)。(2011-9-24 15:49)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int F[ 46001 ];
int C[ 11 ];
int V[ 11 ];
int main()
{
int t,n,m,d;
while ( scanf("%d",&t) != EOF )
for ( int i = 1 ; i <= t ; ++ i ) {
scanf("%d%d%d",&n,&m,&d);
for ( int j = 1 ; j <= d ; ++ j ) {
scanf("%d%d",&C[ j ],&V[ j ]);
C[ j ] /= 1000;
}
memset( F, 0, sizeof( F ) );
int max = n,left = 0;
for ( int l = 1 ; l <= m ; ++ l ) {
max += left;
left = max%1000;
max /= 1000;
for ( int j = 1 ; j <= d ; ++ j )
for ( int k = C[ j ] ; k <= max ; ++ k )
if ( F[ k ] < F[ k-C[ j ] ] + V[ j ] )
F[ k ] = F[ k-C[ j ] ] + V[ j ];
max = 1000*max+F[ max ];
}
printf("%d\n",max+left);
}
return 0;
}