题意:题目给定N部电影,每部电影有时长和价值,要求看M部电影,并且时间控制在L以内,转化为背包问题,让我们在N件物品中找正好M件物品塞进容量L的包中,求最大的价值。
// dp[i][j] 表示在容量为 i 的空间里面看 j部电影的最大收获价值
// 背包
#include <iostream>
#include <algorithm>
#include <queue>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MOD 1000000007
#define maxn 110
int dp[1010][maxn];
int t[maxn],va[maxn];
int main()
{
int N,M,L;
int T;
scanf("%d",&T);
int i,j,k;
while(T--){
scanf("%d %d %d",&N,&M,&L);
for(i=1;i<=N;i++)
scanf("%d %d",&t[i],&va[i]);
for(i=1;i<=L;i++)
for(j=1;j<=M;j++)
dp[i][j]=0;
//memset(dp,0,sizeof(dp));
for(i=1;i<=N;i++){
for(j=L;j>=t[i];j--)
for(k=1;k<=M;k++)
if(!(k-1)||dp[j-t[i]][k-1]){
dp[j][k]=max(dp[j][k],dp[j-t[i]][k-1]+va[i]);
}
}
printf("%d
",dp[L][M]);
}
return 0;
}