01背包问题是动态规划的经典问题, 也是基础问题。
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>
#include "inputf.h"
int knapsack_2d(int v, int n, const int *c, const int *p)
{
int *s = (int *)malloc(n * v * sizeof(int));
#define f(a,b) (*(s + (a) * v + (b)))
//int(*d)[8][100] = (int(*)[8][100])s;
int nn = n, vv = v;
while (--nn >= 0)
{
vv = v;
while (--vv >= 0)
{
if (nn + 1 < n) {
f(nn, vv) = f(nn + 1, vv);
if (vv + 1 >= c[nn]) {
int l = (vv + 1 > c[nn] ? f(nn + 1, (vv - c[nn])) : 0) + p[nn];
if (l > f(nn, vv)) f(nn, vv) = l;
}
} else {
f(nn, vv) = vv + 1 >= c[nn] ? p[nn] : 0;
}
}
}
v = f(0, v - 1); // 此处仅仅为了保存 v = f(0, v - 1) 的值
free(s);
return v;
}
/*
* 01背包问题 总价值最大 一维解法
* 返回 h = max{ f[1...n] }
*/