您的位置:首页 > 其它

uva 12563(动态规划起步第三天 01背包变形)

2015-02-15 20:50 302 查看
谈到背包,大家肯定都熟悉,我就不多讲,而这题挺有意思。DP[i][j] 表示前 i 首歌在j时间内唱的最多曲目;

状态有了,那么怎么转移呢? DP[i][j] = max{DP[i - 1][j],DP[i - 1][j - t[i]] + 1};

但是此题还有时间。所以如果初始化为0的话,按照平常背包的代码,很难求出最长时间。

所以我们初始化为-1,且-1时不计算,那么这就避免了01背包的情况;

是不是觉得很像01背包的恰好装满情况。对,当然可以初始化为-无穷;

#include <iostream>
#include <cstdio>
#include <cstring>
#define REP(i,N) for (int i = 0;i < (N);i++)
#define DWN(i,N) for (int i = (N);i >= 0;i--)
#define INF 0x3f3f3f3f;
using namespace std;

int dp[2][180 * 51 +678];
int a[51];
int main (){
int T;
int kase = 0;
//freopen("1.txt","r",stdin);
cin >> T;
while (T--) {
int n,t;
cin >> n >> t;
int p = 1;
REP(i,2) REP(j,t) dp[i][j] = -INF;
dp[0][0] = 0;
int ans = 0;
REP(i,n) cin >> a[i];
REP(i,n) {
REP(j,t) {
dp[p][j] = dp[p ^ 1][j];
if (j >= a[i])
dp[p][j] = max(dp[p ^ 1][j],dp[p ^ 1][j - a[i]] + 1);
ans = max(ans,dp[p][j]);
}
p ^= 1;
}
DWN(i,t - 1) {
if (dp[p ^ 1][i] == ans) {
printf("Case %d: %d %d\n", ++kase, ans + 1, i + 678);
break;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: