HDU 2602 Bone Collector(01揹包問題)
阿新 • • 發佈:2018-12-02
如果直接搜尋,會浪費大量時間搜尋已知的結果,造成超時。
可以用記憶化陣列記錄已經搜尋過的結果,在查詢已知的結果時,直接返回即可
如果你不知道為什麼錯了,那麼...........
請注意是先輸入價值,後輸入容量
利用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; }