您的位置:首页 > 其它

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,不浪费时间,否则输出浪费的时间量。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp uva