存个档:与队列结合的01背包写法
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *data;
int front;
int rear;
int maxsize;
} queue;
int dp[400][400], weigh[400], worth[400];
void initqueue(queue *q, int maxsize) {
q->data = (int *)malloc(maxsize * sizeof(int));
if (!q->data)
exit(1);
q->front = q->rear = 0;
q->maxsize = maxsize;
}
int enqueue(queue *q, int e) {
if ((q->rear + 1) % q->maxsize == q->front)
return 0;
q->data[q->rear] = e;
q->rear = (q->rear + 1) % q->maxsize;
return 1;
}
int dequeue(queue *q) {
if (q->front == q->rear)
return 0;
printf("%d", q->data[q->front]);
q->front = (q->front + 1) % q->maxsize;
return 1;
}
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
queue q;
initqueue(&q, 100);
int i, j, n, t;
scanf("%d%d", &n, &t);
for (i = 1; i <= n; i++) {
scanf("%d%d", &weigh[i], &worth[i]);
}
for (i = 1; i <= n; i++) {
for (j = 1; j <= t; j++) {
if (j < weigh[i]) {
dp[i][j] = dp[i - 1][j];
enqueue(&q, dp[i][j]);
} else {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weigh[i]] + worth[i]);
enqueue(&q, dp[i][j]);
}
}
}
printf("%d\n", dp[n][t]);
return 0;
}