二位背包。我发现自己太帅了,在
if(dp[M][L] == -1)
这一行我居然能写成
if(dp[M][L] != -1)
还一直在琢磨为什么结果是零。
#include <string.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int test_case,N,M,L;
int dvdTimeLen[110],dvdValue[110],dp[110][1100];
//FILE *fp;
//fp = freopen("in3.txt","r",stdin);
scanf("%d",&test_case);
while(test_case --){
scanf("%d%d%d",&N,&M,&L);
for(int i = 0;i < N;++i)
{
scanf("%d%d",&dvdTimeLen[i],&dvdValue[i]);
}
memset(dp,-1,sizeof(dp));
for ( int j = 0 ; j <= L ; j ++ ){
dp[0][j] = 0 ;
}
for(int i = 0; i < N; ++ i){
for(int j = M; j > 0; -- j){
for(int k = L;k >= dvdTimeLen[i];--k){
if(dp[j - 1][k - dvdTimeLen[i]] != -1){
if(dp[j][k] < dp[j - 1][k - dvdTimeLen[i]] + dvdValue[i]){
dp[j][k] = dp[j - 1][k - dvdTimeLen[i]] + dvdValue[i];
}
}
}
}
}
if(dp[M][L] == -1)
dp[M][L] = 0;
printf("%d\n",dp[M][L]);
}
return 0;
}