您的位置:首页 > 编程语言 > C语言/C++

背包问题的C语言实现

2012-03-27 20:55 295 查看
参考一个既有的算法实现了背包问题,算法思路见程序注释。

View Code

/*
*    Fredric 2012-3-27
*  背包问题
*/
#include <stdio.h>
#include <stdlib.h>

#define N (100)

typedef enum E_STATUS{
E_STATUS_NO,
E_STATUS_YES,
};

typedef struct tagNode{
double weight;
double value;
}stNode;

int num                 = 6;
stNode        gNode
= {{5,4},{3,4},{2,3},{1,1},{2,2},{3,4}};
E_STATUS    etempRes
;  //临时解
E_STATUS    eFinalRes
; //最终解

double limitWeight = 14;
double totalValue;
double maxValue;

/*
*    确认第i个背包是否被选择
*  i:第i个背包选择的可能;
*  weight:当前选择的总重量
*  value: 当前选择可能到达的最大价值
*
*  该算法的实现相当于遍历每个背包选中或不选中的所有可能
*/
void search(int i, double weight, double value){

//背包i可以被选中
if (gNode[i].weight + weight < limitWeight)
{
etempRes[i] = E_STATUS_YES;
if (i < num){
search(i + 1, gNode[i].weight + weight, value);
}else{
for (int i = 0; i < num; i++)
{
eFinalRes[i] = etempRes[i];
}
maxValue = value;
}

etempRes[i] = E_STATUS_NO;
}

if (value - gNode[i].value > maxValue)
{
if (i < num){
search(i + 1, weight, value - gNode[i].value);
}else{
for (int i = 0; i < num; i++)
{
eFinalRes[i] = etempRes[i];
}

maxValue = value - gNode[i].value;
}
}

return;
}

void main(void)
{

for (int i = 0; i < num; i++)
{
eFinalRes[i] = E_STATUS_NO;
etempRes[i]  = E_STATUS_NO;
totalValue += gNode[i].value;
}

search(0, 0.0, totalValue);

for (i = 0; i < num; i++)
{
printf("No.%d status:%d\r\n", i, eFinalRes[i]);
}

system("pause");

return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: