如果直接搜索,会浪费大量时间搜索已知的结果,造成超时。
可以用记忆化数组记录已经搜索过的结果,在查询已知的结果时,直接返回即可
如果你不知道为什么错了,那么...........
请注意是先输入价值,后输入容量
利用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;
}