类似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
个人实践大概是利用递归枚举解决问题,但是无法求出多种解决方案。。。求大神赐教
...全文
298 3 打赏 收藏 转发到动态 举报
写回复
用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背包时用的就是动态规划算法

69,369

社区成员

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

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