求思路,怎样运费最少的问题

Diza1986 2018-03-02 09:25:14
举个简单例子,有A,B,C,D四个运输案件

现在可以知道
单独运输费用:
A : 500
B : 400
C : 300
D : 200

合并运输费用: (比单独运还要贵可以很容易从备选中去除掉)
A+B+C : 1101 (比单独各自运输节省99)
A+B : 840 (比单独各自运输节省60)
B+C : 620 (比单独各自运输节省80)
C+D : 360 (比单独各自运输节省40)

最佳的运输方案应该是A+B和C+D,
求教程序的解决思路
...全文
688 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Diza1986 2018-03-22
  • 打赏
  • 举报
回复
结合业务加了一些分组等优化逻辑,终于OK了。 核心还是递归全组合,谢谢大家了!
Diza1986 2018-03-13
  • 打赏
  • 举报
回复
递归,在全组合里找最优解,代码是实现了,数据量稍微大一点结果都出不来。。。哭晕了
Diza1986 2018-03-03
  • 打赏
  • 举报
回复
递归,回溯,全遍历求最优解吗, 可能确实是没有什么好方法, 感觉没有什么规律性在里面来走捷径啊, 实际不像举例数据量这么少。。。
赵4老师 2018-03-02
  • 打赏
  • 举报
回复
仅供参考:
//qplw.cpp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int v=0;
int w=0;
int m;//记录字符串长度
int n;//记录字符串中的字符种类数
char map[256];//记录是哪几种字符
int count[256];//记录每种字符有多少个
int stack[1000];//递归用的栈,并记录当前生成的排列
void Make_Map(char *str) {//统计字符串的相关信息
    int s[256];
    int i;
    memset(s,0,sizeof(s));
    memset(count,0,sizeof(count));
    m=strlen(str);
    if (w<1 || m<w) w=m;
    while(*str) {
        s[*str]++;
        str++;
    }
    n=0;
    for (i=0;i<256;i++)
        if (s[i]) {
            map[n]=i;
            count[n]=s[i];
            n++;
        }
}
void Find(int depth) {//递归式回溯法生成全排列
    if (depth==w) {
        int i;
        for (i=0;i<depth;i++) putchar(map[stack[i]]);
        putchar('\n');
    } else {
        int i;
        if (v && depth>0) {
            for (i=0;i<depth;i++) putchar(map[stack[i]]);
            putchar('\n');
        }
        for (i=0;i<n;i++)
            if (count[i]) {
                stack[depth]=i;
                count[i]--;
                Find(depth+1);
                count[i]++;
            }
    }
}
void main(int argc,char**argv) {
    if (argc<2) {
        printf("%s 要产生全排列的字符串 [限定长度|-1]\n",argv[0]);
        return;
    }
    if (argc>=3) w=atoi(argv[2]);
    if (-1==w) v=1;
    Make_Map(argv[1]);
    Find(0);
}
//C:\test>qplw
//qplw 要产生全排列的字符串 [限定长度|-1]
//
//C:\test>qplw 123
//123
//132
//213
//231
//312
//321
//
//C:\test>qplw 123 2
//12
//13
//21
//23
//31
//32
//
//C:\test>qplw 122333 3
//122
//123
//132
//133
//212
//213
//221
//223
//231
//232
//233
//312
//313
//321
//322
//323
//331
//332
//333
//
//C:\test>qplw 123 -1
//1
//12
//123
//13
//132
//2
//21
//213
//23
//231
//3
//31
//312
//32
//321
//
faihung 2018-03-02
  • 打赏
  • 举报
回复
你的思路都出来了,那么接下来就是 if else 了。
Diza1986 2018-03-02
  • 打赏
  • 举报
回复
解释一下,A,B,C,D是4批货物送往4个地点,单独配送的费用是 A : 500 B : 400 C : 300 D : 200 通过价格表计算可以知道下面几种合并运送的方式比单独送费用低, A+B+C : 1101 (比单独各自运输节省99) A+B : 840 (比单独各自运输节省60) B+C : 620 (比单独各自运输节省80) C+D : 460 (比单独各自运输节省40) ×××这里上面写的360,算错了××× 单独看,A+B+C节省最多,如果作为最优方案保留的话,结果就是A+B+C和D单独,费用1101+200 = 1301 但是整体看,如果采用A+B和C+D费用是840+460= 1300,其实是最优的, 平时很少接触算法,这个问题的模型考虑不清楚,最短路?背包?线性规划? 真心有点懵,还请给个思路
幻夢之葉 2018-03-02
  • 打赏
  • 举报
回复
这种数据量少的,无非就是遍历所有可能情况,选取最优结果
donjin9 2018-03-02
  • 打赏
  • 举报
回复
可以像赵老师中的C:\test>qplw 123 -1,把8种费用所有组合都检查一遍,再选个最小的。

69,373

社区成员

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

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