题意:题目给定N部电影,每部电影有时长和价值,要求看M部电影,并且时间控制在L以内,转化为背包问题,让我们在N件物品中找正好M件物品塞进容量L的包中,求最大的价值。 // dp[i][j] 表示在容量为 i 的空间里面看 j部电影的最大收获价值 // 背包 #include#include #include #include #include #include using namespace std;#define MOD 1000000007#define maxn 110int 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\n",dp[L][M]); } return 0;}