题目链接:
http://acm.hdu.ed
u.cn/showproblem.php?pid=3496
#include<stdio.h>
#include<string.h>
int value[110] , time[110] , fine[101][10001] ;
int main ()
{
int cas , n , m , total_tim ;
scanf ("%d",&cas) ;
while (cas--)
{
scanf ("%d%d%d",&n ,&m,&total_tim) ;
for (int i=0;i<n;++i)
scanf ("%d%d",time+i,value+i) ;
for (int i=0;i<=m;i++)
for (int j=0;j<=total_tim;j++)
{
fine[i][j]=-1;
if (i==0) fine[i][j]=0;
}
for(int i =0;i<n;i++)
for(int k=m;k>=1;--k)//从大到小,可以保证不重复放,一次放进去一个
//多层循环从小到大循环相当于完全背包,从大到小相当于01背包
for( int j=total_tim;j>=time[i];--j)
{
if(fine[k-1][j-time[i]]!=-1)
if(fine[k][j]<fine[k-1][j-time[i]]+value[i] )
fine[k][j]=fine[k-1][j-time[i]]+value[i];
}
if ( fine[m][total_tim] == -1 ) fine[m][total_tim] = 0 ;
printf ( "%d\n" , fine[m][total_tim] ) ;
}
return 0 ;
}
u.cn/showproblem.php?pid=3496