标签:
第一遍洗了个01背包,居然骗过了7个测试点。
后来才发现没我想的那么简单。
dp[i][j][k]为前i首放在前j张光盘上,占用了第j个光盘的k分钟所能装的歌的数量
/*
ID: modengd1
PROG: rockers
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
int main()
{
freopen("rockers.in","r",stdin);
freopen("rockers.out","w",stdout);
int n,t,m;
int i,j,k;
int a[25];
int dp[25][25][25]= {0}; //f[i][j][k] 第i首歌装在第j个CD上
scanf("%d%d%d",&n,&t,&m);
for(i=1; i<=n; i++)
scanf("%d",&a[i]);
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
for(k=0; k<=t; k++)
{
dp[i][j][k]=dp[i-1][j][k];
if(k>=a[i])
dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k-a[i]]+1);
if(j>1&&t>=a[i])
dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-1][t-a[i]]+1);
}
cout<<dp[n][m][t]<<endl;
return 0;
}
标签:
原文地址:http://www.cnblogs.com/modengdubai/p/4843607.html