HDU 2602 Bone Collector(01背包问题)

来源:互联网 发布:java if else语句 编辑:程序博客网 时间:2024/06/05 15:37

如果直接搜索,会浪费大量时间搜索已知的结果,造成超时。

可以用记忆化数组记录已经搜索过的结果,在查询已知的结果时,直接返回即可



如果你不知道为什么错了,那么...........

请注意是先输入价值,后输入容量


利用dp可以更好的处理,提升效率

void solve(int i, int j) {for (int i = 0; i <= N; i++) {for (int j = 0; j <= V; j++) {if (j < weight[i]) {dp[i+1][j] = dp[i][j];} else {dp[i+1][j] = max(dp[i][j], dp[i][j-weight[i]]+value[i]);}}}printf("%d\n", dp[N][V]);}



搜索如下

#include<stdio.h>#include<string.h>int N, V;int weight[1005], value[1005];int dp[1005][1005];int max(int a, int b) {return a>b?a:b;}int solve(int i, int j) {if (dp[i][j] >= 0) {return dp[i][j];}int sum;if (i == N) {sum = 0;} else if (j < weight[i]) {sum = solve(i+1, j);} else {sum = max(solve(i+1, j), solve(i+1, j - weight[i]) + value[i]);}return dp[i][j] = sum;}int main(void){int n;scanf("%d", &n);while (n--) {scanf("%d %d", &N, &V);    for (int i = 0; i < N; i++) {scanf("%d", &value[i]);    }    for (int i = 0; i < N; i++) {scanf("%d", &weight[i]);    }memset(dp, -1, sizeof(dp));printf("%d\n", solve(0, V));}return 0;}


原创粉丝点击