(200分)一个算法问题

dayedexiaohao 2009-05-29 11:02:21
加精
在一条街上有n个商店,每个商店有一种商品可卖,有数字代替商品名,商品都有价格,各个商店可卖同一种商品而价格可以不一样,现在又一个人要从街头走到结尾去购物,他手上有一张要购买的商品的清单,现在必须按照清单上的次序依次购买商品,求花费最小的购物方法;

例如
购物清单:(数字代替商品名)
2 2 5 1
商店情况:

商店 S1 S2 S3 S4 S5 S6 S7 S8

商品 2 3 2 5 2 5 4 1

价格 50 80 40 60 42 65 100 30



花费最小的方法是:S3 S5 S6 S8 === 40+42+65+30=177

要求是尽可能高效率的算法,因为自己的算法都超时了。

...全文
4876 230 打赏 收藏 转发到动态 举报
写回复
用AI写文章
230 条回复
切换为时间正序
请发表友善的回复…
发表回复
索隆 2012-05-07
  • 打赏
  • 举报
回复
楼主说的:

花费最小的方法是:S3 S5 S6 S8 === 40+42+65+30=177

为什么不是:
S3 S5 S6 S8 === 40+42+60+30=172
???

梓琳宇恒 2011-12-08
  • 打赏
  • 举报
回复
哪位高手能够帮忙解答一下最少费用购物问题,需要解答思路和执行代码!!!谢谢各位高手了
z5503317 2010-08-03
  • 打赏
  • 举报
回复
没错,在这里动态规划是最快速的
而不只是先到了用双链表的办法,将数据完全存储在链表了,然后进行提取,建立新链表,在新链表里排序,然后再对链表里的数据进行操作~~!
这样的方法,时间复杂度基本上就是动态规划的几倍,所以,还是用动态规划最省时间,如果不理解动态规划的话,用我的这个方法貌似还行~~!
lore_home 2010-07-30
  • 打赏
  • 举报
回复
动态规划,贪心算法
winematrix 2010-07-30
  • 打赏
  • 举报
回复
Will recursive-based methods have scalability issue?

[Quote=引用 148 楼 gibgas 的回复:]

C/C++ code

struct Tstore
{
int good;
int price;
int name;
void set(int g, int p, int n)
{
good = g;
price = p;
name = n;
}
};

int lowestCost(Tstore*……
[/Quote]
Justmeh 2010-07-30
  • 打赏
  • 举报
回复
int MinCost(int *cost,int *shop,int *goods,int shopNum,int goodsNum,int *path)
{
int mincost = MAXNUM;

if(shopNum<=1 || goodsNum<=1)
{
for(int i=shopNum-1;i>=0;i--)
{
if(shop[i]==goods[goodsNum-1] && cost[i]<mincost)
{
mincost = cost[i];
path[goodsNum-1] = i;
}
}
return mincost;
}

int tmpcost;
int *tmppath = new int[goodsNum-1];
for(int i=shopNum-1;i>=0;i--)
{
if(shop[i]==goods[goodsNum-1])
{
tmpcost = MinCost(cost,shop,goods,i,goodsNum-1,tmppath)+cost[i];
if(tmpcost<mincost)
{
mincost = tmpcost;
path[goodsNum-1] = i;
for(int j=0;j<goodsNum-1;j++)
{
path[j] = tmppath[j];
}
}
}
}
delete []tmppath;

return mincost;
}
btw616 2010-07-29
  • 打赏
  • 举报
回复
深搜应该可以解决问题吧,不过超不超时就要看数据了。。。或者说rp了。。。。可以加一个简单的控制变量,超了就剪枝,不过。。。
雪域迷影 2010-07-26
  • 打赏
  • 举报
回复
不错,看来动态规划挺重要的,好几次做Acm编程题,都遇到它了!
半瓶子乱晃荡 2010-07-23
  • 打赏
  • 举报
回复
我看不懂啊,从街头到街尾,还必须是按清单顺序。让回头重走一遍吗?还是这条街只能走一次?
ljia0 2010-07-21
  • 打赏
  • 举报
回复
n的规模有多大,如果很大的话,可以考虑用遗传算法来解决。
forster 2010-07-20
  • 打赏
  • 举报
回复
感觉少说了什么
myCPL 2010-07-14
  • 打赏
  • 举报
回复
呵呵简单阿
Generics 2010-07-14
  • 打赏
  • 举报
回复
感觉LZ没有把问题说清楚.

购物的时候, 应该是可以往回走的吧? 那LZ举的例子里, 花费最小的方法应该是 S3 S5 S4(往回走) S8 = 40+42+60+30=172.
如果要求不能往回走(实际中大概是不可能的, 因为第一遍肯定是扫盲商品和价格, 只有在最后一家店铺才能谈得上开始购买), 大部分的CASE都是没有答案!

譬如
购物清单 2 2 5 1
商店情况
S1 1 30
S2 4 100
S3 5 65
S4 2 42
S5 5 60
S6 2 40
S7 3 80
S8 2 50
edison1226 2010-07-10
  • 打赏
  • 举报
回复
学习中~~~
超级大笨狼 2010-06-19
  • 打赏
  • 举报
回复
写代码调试,只用了10多分钟。
DP深搜的模式熟悉了而已。
超级大笨狼 2010-06-19
  • 打赏
  • 举报
回复

<SCRIPT LANGUAGE="JavaScript">
var info=[
{store:'S1',product:2,price:50},
{store:'S2',product:3,price:80},
{store:'S3',product:2,price:40},
{store:'S4',product:5,price:60},
{store:'S5',product:2,price:42},
{store:'S6',product:5,price:65},
{store:'S7',product:4,price:100},
{store:'S8',product:1,price:30}];
var list=[2,2,5,1];
var minCost=1<<10;
var bestPath="";
F(0,0,0,"");
function F(i,j,c,p){
if(j==list.length){
minCost=(minCost<c)?minCost:c;
bestPath=p;
return; //如果买完了
}
if(i==info.length){
return; //如果逛完了
}
if(info[i].product==list[j]){
//如果有卖的,买之
F(i+1,j+1,c+info[i].price,p+" "+info[i].store);
}
F(i+1,j,c,p);//没买
}
alert(bestPath+ "\n"+ minCost);
//S3 S5 S6 S8 === 40+42+65+30=177结果正确,瞬间得出
</SCRIPT>




wuxianyi 2010-06-18
  • 打赏
  • 举报
回复
是不是背包问题
shihunjiangjie 2010-06-15
  • 打赏
  • 举报
回复
可惜没看懂
yue0132 2010-06-15
  • 打赏
  • 举报
回复
一般的DP问题
ronniegxq 2010-06-14
  • 打赏
  • 举报
回复
已阅已阅已阅已阅已阅
加载更多回复(203)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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