题目链接:Click here~~
题意:
有n个电影,每个电影有时间c和价值w两种属性,从中选m个,且必须是m个,使时间不超过T且价值最大。
解题思路:
挺裸的二维01背包,只是有一维要装满,标记下即可。
状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c]+w).( i 表示电影个数, j 表示时间)
初始时将dp[0][j]都设为0,其他都设为-1。-1表示不能装满。
#include <stdio.h>
#include <string.h>
#define max(a,b) a > b ? a : b
int dp[103][1003];
int main()
{
int z,n,m,c,w,T;
scanf("%d",&z);
while(z--)
{
memset(dp,-1,sizeof(dp));
memset(dp[0],0,sizeof(dp[0]));
scanf("%d%d%d",&n,&m,&T);
for(int k=1;k<=n;k++)
{
scanf("%d%d",&c,&w);
for(int i=m;i>=1;i--)
for(int j=T;j>=c;j--)
if(dp[i-1][j-c] != -1)
dp[i][j] = max(dp[i][j],dp[i-1][j-c]+w);
}
if(dp[m][T] < 0)
puts("0");
else
printf("%d\n",dp[m][T]);
}
return 0;
}