hdu 3496 Watch The Movie

题意:题目给定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; }
原文地址:https://www.cnblogs.com/372465774y/p/3189141.html