链接:点击打开链接
题意:有N张电影票,但只可以买M张,并且最多可以看L分钟,给出每场电影的长度和价值,求出看M场电影的最大值,如果不能看够M场则输出0
代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int dp[105][1005];
int v[1005],w[1005];
int main(){
int i,j,k,l,m,n,t;
scanf("%d",&t);
while(t--){ //二维01背包,把m和l都当作容量
scanf("%d%d%d",&n,&m,&l);
for(i=0;i<n;i++)
scanf("%d%d",&w[i],&v[i]);
memset(dp,-1,sizeof(dp));
for(j=0;j<=l;j++)
dp[0][j]=0;
for(i=0;i<n;i++)
for(j=m;j>=1;j--)
for(k=l;k>=w[i];k--)
if(dp[j-1][k-w[i]]!=-1) //不能初始化成0,因为可能种数并没增加,也就是j含有了非法的情况
dp[j][k]=max(dp[j][k],dp[j-1][k-w[i]]+v[i]);
if(dp[m][l]==-1)
puts("0");
else
printf("%d\n",dp[m][l]);
}
return 0;
}