DFS会超时
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m, v[N], w[N];
int dfs(int x, int spv) {
if (x > n) return 0;
else if (spv < v[x]) {
return dfs(x + 1, spv);
} else if (spv >= v[x]) {
return max(dfs(x + 1, spv), dfs(x + 1, spv - v[x]) + w[x]);
}
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &v[i],&w[i]);
}
int res = dfs(1, m);
printf("%d\n", res);
return 0;
}
记忆化搜索
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m, v[N], w[N];
int eme[N][N];
int dfs(int x, int spv) {
int res=0;
if (eme[x][spv]) return eme[x][spv];
if(x>n){
res=0;
}
else if (spv < v[x]) {
//因为背包容量不足,不能选
res= dfs(x + 1, spv);
} else if (spv >= v[x]) {
//选择最优解,是可选与不可选
res=max(dfs(x + 1, spv), dfs(x + 1, spv - v[x]) + w[x]);
}
eme[x][spv]=res;
return res;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &v[i],&w[i]);
}
int res = dfs(1, m);
printf("%d\n", res);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m, v[N], w[N];
int a[N][N];
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d %d", &v[i],&w[i]);
}
for(int i=1;i<=n;i++) {
for(int j=0;j<=m;j++) {
a[i][j]=a[i-1][j]; // 不取第 i 件物品
if(j>=v[i]) {
a[i][j]=max(a[i-1][j],a[i-1][j-v[i]]+w[i]); // 取第 i 件物品
}
}
}
printf("%d\n", a[n][m]);
return 0;
}