度度熊的午饭时光
Accepts: 659
Submissions: 8046
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
(该题输出描述可能有点问题,题目要求是先按照序列和最小,相等时再按照字典序。我是直接按照字典序做的,最后是过了,不知道数据水还是题目描述的问题。看讨论区也都是先按照字典序)
代码:
#include <stdio.h>
#include <string.h>
#define N 1005
int dp[N];
bool path[110][N];
int a[110], b[110];
int ans[110];
int main(){
int t, m, n;
int cas = 0;
scanf("%d", &t);
while(t--){
scanf("%d%d", &m, &n);
for(int i = 1; i <= n; i++)
scanf("%d%d", &a[i], &b[i]);
memset(dp, 0, sizeof(dp));
memset(path, false, sizeof(path));
for(int i = 1; i <= n; i++){
for(int j = m; j >= b[i]; j--){
if(dp[j] < dp[j-b[i]] + a[i]){
dp[j] = dp[j-b[i]] + a[i];
path[i][j] = true;
}
}
}
printf("Case #%d:\n", ++cas);
int v = m, sum = 0, index = 0;
for(int i = n; i >= 1 && v >= 0; i--){
if(path[i][v]){
ans[index++] = i;
sum += b[i];
v -= b[i];
}
}
printf("%d %d\n", dp[m], sum);
if(index == 0)continue;
for(int i = index-1; i > 0; i--)
printf("%d ", ans[i]);
printf("%d\n", ans[0]);
}
return 0;
}求ans数组时,把m和n弄混了,结果一直是RE,数组越界。。。。。
┏┓ ┏┓
┏┛┻━━━┛┻┓
┃ ┃
┃ ━ ┃
┃ ┳┛ ┗┳ ┃
┃ ┃
┃ ┻ ┃
┃ ┃
┗━┓ ┏━┛
┃ ┃
┃ ┃
┃ ┗━━━┓
┃ ┣┓
┃ ┏┛
┗┓┓┏━┳┓┏┛

本文介绍了一个经典的01背包问题案例——度度熊如何在预算内选择最高分且不重复的午餐菜品。通过使用动态规划算法并记录路径,实现了在限定条件下找到最优解的方法。

1万+

被折叠的 条评论
为什么被折叠?



