类似01背包问题,求最优解决方案

机智的猪蹄 2015-02-03 07:43:00
题目要求如下:外卖问题
程序先输入一个数字M,表示送餐箱的大小。再输入一个数字N,表示一共有多少个外卖等待配送,然后输入N个整数,表示每个外卖所占空间大小。
可能有若干种最优方案,程序要求输出每种最优方案。
每行输出若干个数字,表示最优方案下,装下的各个外卖的序号。
测试样例:
输入1:
10
4
2 3 5 10
输出1:
1 2 3
4
输入2:
10
4
11 1 1
输出2:
12 3 4
个人实践大概是利用递归枚举解决问题,但是无法求出多种解决方案。。。求大神赐教
...全文
315 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
就想叫yoko 2015-02-04
  • 打赏
  • 举报
回复
贴个动规的,如果想求所有最优解用回溯也可以啊
#include <stdio.h>                                                              
#include <stdlib.h>                                                             
                                                                                
int knapsack(int num, int capacity, int *weight_arr, int *value_arr, int *is_picked)
{                                                                               
    int i = 0;                                                                  
    int j = 0;                                                                  
    int **array = (int **)calloc(num + 1, sizeof(int *));                       
    int **prev_capacity = (int **)calloc(num + 1, sizeof(int *));               
    i = 0;                                                                      
    for (; i < num + 1; ++i) {                                                  
        array[i] = (int *)calloc(capacity + 1, sizeof(int));                    
        prev_capacity[i] = (int *)calloc(capacity + 1, sizeof(int));            
    }                                                                           
                                                                                
    i = 1;                                                                      
    for (; i < num + 1; ++i) {                                                  
        j = 1;                                                                  
        for (; j < capacity + 1; ++j) {                                         
            if (weight_arr[i - 1] > j) {                                        
                array[i][j] = array[i - 1][j];                                  
                prev_capacity[i][j] = j;                                        
            } else {                                                            
                if (array[i - 1][j] > array[i - 1][j - weight_arr[i - 1]] + value_arr[i - 1]) {
                    array[i][j] = array[i - 1][j];                              
                    prev_capacity[i][j] = j;                                    
                } else {                                                        
                    array[i][j] = array[i - 1][j - weight_arr[i - 1]] + value_arr[i - 1];
                    prev_capacity[i][j] = j - weight_arr[i - 1];                
                }                                                               
            }                                                                   
        }                                                                       
    }                                                                           
                                                                                
    i = num;                                                                    
    j = capacity;                                                               
    for (; i > 0; --i) {                                                        
        if (prev_capacity[i][j] != j) {                                         
            is_picked[i - 1] = 1;                                               
            j = prev_capacity[i][j];                                            
        }                                                                       
    }                                                                           
                                                                                
    int ret = array[num][capacity];                                             
    i = 0;                                                                      
    for (; i < num + 1; ++i) {                                                  
        free(array[i]);                                                         
        free(prev_capacity[i]);                                                 
    }                                                                           
    free(array);                                                                
    free(prev_capacity);                                                        
    return ret;                                                                 
}                                                                               
                                                                                
int main()                                                                      
{                                                                               
    int capacity = 10;                                                          
    int num = 6;                                                                
    int weight_arr[] = {2, 3, 1, 4, 6, 5};                                      
    int value_arr[] = {5, 6, 5, 1, 19, 7};                                      
    int *is_picked = (int *)calloc(num, sizeof(int));                           
                                                                                
    int i = 0;                                                                  
    printf("<<<<<input<<<<<\n");                                                
    for (; i < num; ++i) {                                                      
        printf("%d:weight=%d value=%d\n", i, weight_arr[i], value_arr[i]);      
    }                                                                           
    printf(">>>>>\n");                                                          
    printf("max weight:%d\n", capacity);                                        
                                                                                
    int ret = knapsack(num, capacity, weight_arr, value_arr, is_picked);        
    i = 0;                                                                      
    printf("<<<<<output<<<<<\n");                                               
    for (; i < num; ++i) {                                                      
        if (is_picked[i] == 1) {                                                
            printf("%d:weight=%d value=%d\n", i, weight_arr[i], value_arr[i]);  
        }                                                                       
    }                                                                           
    printf(">>>>>\n");                                                          
    printf("max value:%d\n", ret);                                              
                                                                                
    free(is_picked);                                                            
    return 0;                                                                   
} 
fly_dragon_fly 2015-02-04
  • 打赏
  • 举报
回复
怎么算最优方案没定义?
百曉生 2015-02-04
  • 打赏
  • 举报
回复
就是啊,什么算最优 我们以前将01背包时用的就是动态规划算法
内容概要:本文介绍了使用Matlab遗传算法解决0-1背包问题的方法和技术细节。首先阐述了0-1背包问题的背景及其经典性质,即在给定物品质量和背包载重的情况下,寻使所有背包所装物品质量总和最大的最优解。接着深入探讨了遗传算法的基本概念,如选择、交叉、变异等关键环节,并详细讲解了如何用二进制或浮点编码表示物品特性,同时设计适应度函数评估每种组合的效果。最后提供了完整的Matlab代码实现,包括设置物品质量与背包载重数据、定义适应度函数、执行遗传操作等部分,并附有详尽的注释以便于理解和修改。 适合人群:对优化算法感兴趣的研究人员、学生或者有一定编程基础并想深入了解遗传算法应用于实际问题解决方案的人士。 使用场景及目标:适用于需要处理类似0-1背包问题的实际应用场景,比如物流配送规划、资源分配等领域;目标是掌握遗传算法的工作原理及其在特定条件下的应用技巧,从而能够在自己的项目中灵活运用。 其他说明:文中提供的代码仅为示例,在实际应用时可根据具体情况调整参数配置和算法流程,以获得更加精准有效的结果。此外,对于想要进一步提升性能的开发者来说,还可以探索更多高级特性和优化方法。
内容概要:本文详细介绍了利用MATLAB遗传算法解决0-1背包问题的方法。文中首先明确了0-1背包问题的具体描述,即在给定物品质量和背包最大载重的情况下,寻找使背包总质量最大的装包方案。接着展示了完整的MATLAB源码,包括参数定义、种群初始化、适应度函数计算、选择操作、交叉操作、变异操作以及种群更新等步骤。同时,针对适应度函数的设计进行了深入探讨,提出了超载惩罚机制、多点交叉方法、动态变异概率等优化措施。此外,还提供了具体的编码技巧,如二维矩阵表示三维分配,以减少内存占用并提高效率。 适用人群:适用于具有一定编程基础,尤其是熟悉MATLAB环境的研究人员和技术爱好者。 使用场景及目标:本篇文章旨在帮助读者理解遗传算法的基本原理及其在解决组合优化问题中的应用。通过学习本文提供的实例代码,读者能够掌握如何构建和调整遗传算法模型,从而应用于类似的资源分配、路径规划等领域的问题解。 其他说明:文中不仅给出了详细的代码解释,还分享了一些实用的小技巧,如初始化种群时避免全0情况、适应度函数中超载判断的向量化操作等。对于想要深入了解遗传算法或者寻快速验证解决方案的人来说,这篇文章提供了一个很好的起点。

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧