#include<iostream>
using namespace std;
static int m = 0;
int w[] = { 0,5,3,2,1 };
int v[] = { 0,4,4,3,1 };
int op[5];
int x[5];
void dfs(int i, int tw,int rw, int tv, int op[]) {
if (i >= 5) {
if (tw == 6 && tv > m) {
m = tv;
for (int j = 1; j <= 4; j++) {
x[j] = op[j];
}
}
}
else {
if (tw +w[i]<= 6) {//重量没达到限制才可以选中
op[i] = 1;//op也是从下标为1开始,表示第i个物品取或不取
dfs(i + 1, tw + w[i],rw-w[i], tv + v[i],op);
}
if (tw + rw - w[i] >= 6) {//不选他没关系,依旧可以达到重量要求
op[i] = 0;
dfs(i + 1, tw,rw-w[i], tv, op);//注意:这里剩余的可选重量要减去当前的,因为他已经决定不选了
}
}
}
int main() {
dfs(1, 0,11, 0, op);
for (int i = 1; i <= 4; i++) {
cout << x[i] << " ";
}
return 0;
}
回溯法求解01背包问题(重量恰好是w)
最新推荐文章于 2025-05-23 08:55:07 发布