二维方程
f
[
i
,
v
]
=
m
a
x
(
f
[
i
−
1
,
v
]
,
f
[
i
−
1
,
v
−
c
[
i
]
]
+
w
[
i
]
)
f[i,v]=max(f[i-1,v],f[i-1,v-c[i]]+w[i])
f[i,v]=max(f[i−1,v],f[i−1,v−c[i]]+w[i])
不选第
i
i
i件 选第
i
i
i件
一维方程
f
[
v
]
=
m
a
x
(
f
[
v
]
,
f
[
v
−
c
[
i
]
]
+
w
[
i
]
)
f[v]=max(f[v],f[v-c[i]]+w[i])
f[v]=max(f[v],f[v−c[i]]+w[i])
不选第
i
i
i件 选第
i
i
i件
例题一:采药
#include<cstdio>
#define _CRT_SECURE_NOWARNINGS
using namespace std;
int ti[101], money[101]; //每株草药消耗的时间和获得的收益
int f[1001];
int main() {
int t, m, i, j;
//t表示总共用来采药的时间
//m表示有m株草药
scanf_s("%d%d", &t, &m);
for(i=1;i<=m;i++)
scanf_s("%d%d", &ti[i], &money[i]);
for (i = 1; i <= m; i++) //遍历
for (j = t; j >= ti[i]; j--)
if (f[j] < f[j - ti[i]] + money[i])
f[j] = f[j - ti[i]] + money[i];
printf("%d", f[t]); //输出用t时间来采药的最大收益
return 0;
}