#include <stdio.h>
#include <stdlib.h>
#define MAX_N 1000
#define MAX_W 1000
int n;
int w[MAX_N];
int v[MAX_N];
int c;
int maxv;
int curw;
int curv;
int bestv[MAX_W];
int bound(int j, int c) {
int b = curv;
int leftw = c - curw;
while (j < n && leftw >= w[j]) {
leftw -= w[j];
b += v[j];
j++;
}
if (j < n) {
b += leftw * v[j] / w[j];
}
return b;
}
void dfs(int i) {
if (i == n) {
maxv = curv;
return;
}
bestv[i+1] = bound(i+1, c);
if (bestv[i+1] < maxv) {
return;
}
dfs(i+1);
if (curw + w[i] <= c) {
curw += w[i];
curv += v[i];
if (curv > maxv) {
maxv = curv;
}
bestv[i+1] = bound(i+1, c);
if (bestv[i+1] > maxv) {
dfs(i+1);
}
curw -= w[i];
curv -= v[i];
}
}
int main() {
printf(("请输入物品数量和背包容量:"));
scanf("%d%d", &n, &c);
for (int i = 0; i < n; i++) {
printf("请输入%d号物品的重量和价值:", i);
scanf("%d%d", &w[i], &v[i]);
}
maxv = curv = 0;
curw = 0;
bestv[0] = bound(0, c);
dfs(0);
printf("获取物品的总价值为%d\n", maxv);
return 0;
}