回溯法 0 1背包问题

用回溯法解决0 1背包问题

#include <stdio.h>
#include <stdlib.h>

/*
    用回溯法解决01背包问题,维护的变量有:
    curState[]: 当前状态中物品是否被选中,若i选中,则curState[i]=1,否则为0.
    optState[]: 从搜索开始到目前状态中的最优状态。
    curWeight:  当前的总重量
    curValue:   当前的总价值
    maxValue:   最佳状态的价值
    curDeep:    当前深度
    N:          总的物品个数
    capacity:   背包的容量
    weight[]:   第i个物品的重量为weight[i]
    value[]:    第i个物品的价值value[i]
*/

int N,capacity;
int *weight,*value;
int maxValue = 0;
int *curState,*optState;

void backtracking(int curDeep,int curWeight,int curValue){

    int i;

    if(curDeep>=N){     //到达叶节点
        if(curWeight<=capacity && curValue>maxValue){

            maxValue = curValue;        //更新最大值和最大状态向量
            for(i=0;i<N;i++){
                optState[i] = curState[i];
            }
        }

    }else{
        curState[curDeep] = 1;  //选中
        if(curWeight+weight[curDeep]<=capacity)
            backtracking(curDeep+1,curWeight+weight[curDeep],curValue+value[curDeep]);

        curState[curDeep] = 0;  //不选
        backtracking(curDeep+1,curWeight,curValue);
    }
}

int main(){

    int i,tw,tv;

    printf("input number of object:\n");
    scanf("%d",&N);
    printf("input capacity of bag:\n");
    scanf("%d",&capacity);

    weight = (int *)malloc(sizeof(int)*N);
    value = (int *)malloc(sizeof(int)*N);
    curState = (int *)malloc(sizeof(int)*N);
    optState = (int *)malloc(sizeof(int)*N);

    printf("input weight and value,by format: weight value\n");
    for(i=0;i<N;i++){
        scanf("%d %d",&tw,&tv);
        weight[i] = tw;
        value[i] = tv;
    }

    backtracking(0,0,0);
    printf("%d\n",maxValue);

    return EXIT_SUCCESS;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值