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背包的恰好装满情况。对,当然可以初始化为-无穷;
状态有了,那么怎么转移呢? 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; } } } }
相关文章推荐
- uva 12563 Jin Ge Jin Qu hao (01背包变形)
- UVa - 12563 - Jin Ge Jin Qu hao(01背包,动态规划)
- UVA 12563 Jin Ge Jin Qu hao(01背包变形:两个条件最优化)
- uva12563(01背包变形,多条件最优解)
- UVA 12563 Jin Ge Jin Qu hao 01背包变形
- UVA 12563 Jin Ge Jin Qu hao(01背包变形:两个背包内容)
- UVA12563: Jin Ge Jin Qu hao(类01背包)
- UVA12563 01背包
- UVa12563_劲歌金曲(动态规划_01背包变形)
- UVA12563 0-1背包变形
- UVa 1213 (01背包变形) Sum of Different Primes
- UVA12563 0-1背包变形
- uva 116(动态规划起步第三天 DAG)
- UVA 12563 劲歌金曲(0-1背包变形~)
- 01背包 uva12563+运算符重载
- UVA 12563 Jin Ge Jin Qu hao 01背包
- 例题9-5 UVA 12563 Jin Ge Jin Qu [h]ao (01 背包)
- 紫书动规 例题9-5 UVA - 12563 Jin Ge Jin Qu hao dp-01背包
- 01背包,恰好装满(劲歌金曲,uva 12563)
- NYOJ - 49 - 开心的小明(01背包变形+动态规划)