uva 10465(背包问题)
2014-10-25 20:34
337 查看
题意:有两种汉堡,吃掉汉堡花费时间m、n,总时间是t,要求输出在时间t内吃掉最多数量的汉堡且不浪费时间,如果一定要浪费,输出汉堡数量和浪费的时间,此时依旧保证浪费的时间最短。
题解:f[i]存储在i时间内吃汉堡能达到的最大时间,f1[i]存储在时间i内能吃掉汉堡的最大数量,先用一个循环更新如果只吃一种汉堡的两个数组的值,然后再用一个循环更新如果在时间i时不吃之前的汉堡而选择吃另一个汉堡所能达到的最大时间更接近i,那么就更新f和f1,如果两者相等,选择吃掉汉堡数量多的那一种更新f1[i]的值。最后先输出f1[t],如果f[t] == t,不浪费时间,否则输出浪费的时间量。
题解:f[i]存储在i时间内吃汉堡能达到的最大时间,f1[i]存储在时间i内能吃掉汉堡的最大数量,先用一个循环更新如果只吃一种汉堡的两个数组的值,然后再用一个循环更新如果在时间i时不吃之前的汉堡而选择吃另一个汉堡所能达到的最大时间更接近i,那么就更新f和f1,如果两者相等,选择吃掉汉堡数量多的那一种更新f1[i]的值。最后先输出f1[t],如果f[t] == t,不浪费时间,否则输出浪费的时间量。
#include <stdio.h> #include <string.h> const int N = 10005; int n, m, t, f , f1 ; int main() { while (scanf("%d%d%d", &m, &n, &t) != EOF) { memset(f, 0, sizeof(f)); memset(f1, 0, sizeof(f1)); for (int i = 1; i <= t; i++) { if (i >= m) { f[i] = f[i - m] + m; f1[i] = f1[i - m] + 1; } } for (int i = 1; i <= t; i++) { if (i >= n && f[i] < f[i - n] + n) { f[i] = f[i - n] + n; f1[i] = f1[i - n] + 1; } else if (i >= n && f[i] == f[i - n] + n) { if (f1[i - n] + 1 > f1[i]) f1[i] = f1[i - n] + 1; } } printf("%d", f1[t]); if (f[t] != t) printf(" %d\n", t - f[t]); else printf("\n"); } return 0; }
相关文章推荐
- [UVA]10465 - Homer Simpson(完全背包问题)
- UVa 10465 - Homer Simpson 背包
- UVA 10465 Homer Simpson(dp + 完全背包)
- UVa 10465 Homer Simpson(DP完全背包)
- UVA - 10465 Homer Simpson 01背包问题(无限)
- UVA 10465 Homer Simpson(完全背包: 二维目标条件)
- UVa 624 CD && joj 1387 CD 背包问题
- UVA 147 Dollars 刀了(完全背包,精度问题)
- 算法->完全背包问题 UVa 674 Coin Change
- uva 10465 Homer Simpson(完全背包)
- UVA 10465 Homer Simpson(完全背包)
- UVa 10465 - Homer Simpson(背包&贪心)
- UVA 10465 Homer Simpson(dp + 完全背包)
- UVA 10465 Homer Simpson(dp + 完全背包)
- UVA 10465 Homer Simpson 完全背包
- uva10130 - SuperSale(dp 0-1背包问题)
- UVa 10465 - Homer Simpson 背包
- UVA 624 CD 0-1背包问题
- uva 10465 Homer Simpson(完全背包)
- UVa 10465 Homer Simpson(DP 完全背包)