• 背包问题的C语言实现


    参考一个既有的算法实现了背包问题,算法思路见程序注释。

    View Code
     1 /*
    2 * Fredric 2012-3-27
    3 * 背包问题
    4 */
    5 #include <stdio.h>
    6 #include <stdlib.h>
    7
    8 #define N (100)
    9
    10 typedef enum E_STATUS{
    11 E_STATUS_NO,
    12 E_STATUS_YES,
    13 };
    14
    15 typedef struct tagNode{
    16 double weight;
    17 double value;
    18 }stNode;
    19
    20 int num = 6;
    21 stNode gNode[N] = {{5,4},{3,4},{2,3},{1,1},{2,2},{3,4}};
    22 E_STATUS etempRes[N]; //临时解
    23 E_STATUS eFinalRes[N]; //最终解
    24
    25
    26 double limitWeight = 14;
    27 double totalValue;
    28 double maxValue;
    29
    30 /*
    31 * 确认第i个背包是否被选择
    32 * i:第i个背包选择的可能;
    33 * weight:当前选择的总重量
    34 * value: 当前选择可能到达的最大价值
    35 *
    36 * 该算法的实现相当于遍历每个背包选中或不选中的所有可能
    37 */
    38 void search(int i, double weight, double value){
    39
    40 //背包i可以被选中
    41 if (gNode[i].weight + weight < limitWeight)
    42 {
    43 etempRes[i] = E_STATUS_YES;
    44 if (i < num){
    45 search(i + 1, gNode[i].weight + weight, value);
    46 }else{
    47 for (int i = 0; i < num; i++)
    48 {
    49 eFinalRes[i] = etempRes[i];
    50 }
    51 maxValue = value;
    52 }
    53
    54 etempRes[i] = E_STATUS_NO;
    55 }
    56
    57 if (value - gNode[i].value > maxValue)
    58 {
    59 if (i < num){
    60 search(i + 1, weight, value - gNode[i].value);
    61 }else{
    62 for (int i = 0; i < num; i++)
    63 {
    64 eFinalRes[i] = etempRes[i];
    65 }
    66
    67 maxValue = value - gNode[i].value;
    68 }
    69 }
    70
    71 return;
    72 }
    73
    74
    75
    76 void main(void)
    77 {
    78
    79 for (int i = 0; i < num; i++)
    80 {
    81 eFinalRes[i] = E_STATUS_NO;
    82 etempRes[i] = E_STATUS_NO;
    83 totalValue += gNode[i].value;
    84 }
    85
    86 search(0, 0.0, totalValue);
    87
    88 for (i = 0; i < num; i++)
    89 {
    90 printf("No.%d status:%d\r\n", i, eFinalRes[i]);
    91 }
    92
    93 system("pause");
    94
    95 return;
    96 }



  • 相关阅读:
    jquery点击事件后增加克隆的标签,并改变克隆的属性加入
    jQuery 文本插入和标签移动方法
    用jquery来实现正反选选择框checkbox的小示例
    js 常用事件句柄总结
    jQuery 菜单小练习(实现点击和移动鼠标效果)
    jQuery 选择器
    js 中移动元素的方法
    《JavaScript总结》深拷贝和浅拷贝
    《JavaScript总结》js的运行机制
    git 撤回放到暂存区的文件
  • 原文地址:https://www.cnblogs.com/fredric/p/2420143.html
Copyright © 2020-2023  润新知