这道题如果没有最后面那个限制条件 “ 如果能看完m部电影,就输出最大值,否则输出0 ” 那么这道题就直接套用二维费用背包模板,AC
但是有这个限制条件。。。。
参考了网上众多大神的解题报告,都是初始化dp[][], 这块,也没有说清楚具体原理,
在本题中求最后的结果时 有一维应该是满的,从dp[m][]中去寻找答案。。如果求最大值 那么初始化为负无穷大,如果求最小值,则初始化为正无穷大。
附上代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
const int MAX=2147483648;
using namespace std;
#define N 1100
int dp[N][N];
int a[N],b[N];
int main()
{
int t,n,m,l;
cin>>t;
while(t--)
{
cin>>n>>m>>l;
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i],&b[i]);
for(int i=1;i<=m;i++)
for(int j=0;j<=l;j++)
dp[i][j]=-MAX;
dp[0][0]=0;
for(int i=1;i<=n;i++)
{
for(int j=m;j>=1;j--)
{
for(int c=l;c>=a[i];c--)
dp[j][c]=max(dp[j][c],dp[j-1][c-a[i]]+b[i]);
}
}
if(dp[m][l]<0)
printf("0\n");
else
printf("%d\n",dp[m][l]);
}
return 0;
}