社区
数据结构与算法
帖子详情
如何用回溯法实现
hyqryq
2000-12-19 02:23:00
有一批物品共N个,不发生化学反应的可以放在同一个仓库,求一种放物品的方法,
可以用最少的仓库.
...全文
232
9
打赏
收藏
如何用回溯法实现
有一批物品共N个,不发生化学反应的可以放在同一个仓库,求一种放物品的方法, 可以用最少的仓库.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hyqryq
2000-12-22
打赏
举报
回复
那另一个:hyqryq@163.net
lu_yb
2000-12-22
打赏
举报
回复
lu_yb@163.net
最好不要用263的信箱给我写东西,因为我们这里把263给屏蔽掉了,嘻嘻
hyqryq
2000-12-22
打赏
举报
回复
OK! 多谢多谢!
立即加分!
留个E_mail好吗?有什么问题可以共同探讨嘛!
我的:hyqryq@263.net
lu_yb
2000-12-22
打赏
举报
回复
我程序都给你了,你都不给我分,555555~~~~
"最少"是这样得出来的:如果你遍例的所有的情况,那是不是就知道哪种
最少了.当然是不需要遍例所有的情况的,只要记录一个目前遍例过的
情况中的最小值,然后如果目前在遍例的情况比这个值大的就放弃并
回溯,就可以比较快的得到最小值了.
第一个仓库里有多少物品不能说明任何问题.
hyqryq
2000-12-22
打赏
举报
回复
感谢各位高手的热情帮助!
我也想过这个问题,但我不知道如何才能说明用"最少"的仓库,
可不可能出现5,3,1和4,4这样的情况,虽然第一个仓库装的物品
最多,但能说明总仓库数最少吗?
lu_yb
2000-12-21
打赏
举报
回复
我修改调试了一下,完整程序如下.当然其中的数据你可以自己改的.
#include <stdio.h>
#define N 10
int a[N][N] = { 0,1,1,0,1,0,1,0,0,1,
1,0,0,0,0,1,0,0,0,0,
1,0,0,1,0,0,1,0,1,1,
0,0,1,0,0,0,0,1,0,0,
1,0,0,0,0,1,0,0,0,0,
0,1,0,0,1,1,1,1,1,1,
1,0,1,0,0,1,0,0,0,0,
0,0,0,1,0,1,0,0,1,1,
0,0,1,0,0,1,0,1,0,1,
1,0,1,0,0,1,0,1,1,0
};
int w[N+1][N+1] ;
int minnum = N;
int curnum = 0 ;
void addtowarehouse(int item)
{
int i,j,k1,k2;
for(i=1;i<=curnum;i++)
{
j=0;
while(w[i][j]!=0&&a[w[i][j]-1][item-1]!=1)
j++;
if(w[i][j]==0)
{
if(item==N)
{
minnum = curnum;
w[i][j] = item;
for(k1=1;k1<=curnum;k1++)
{
k2=0;
printf("%d:",k1);
while(w[k1][k2]!=0)
{
printf(" %d ",w[k1][k2]);
k2++;
}
printf("\n");
}
printf("\n");
w[i][j] = 0;
return;
}
else
{
w[i][j] = item;
addtowarehouse(item+1);
}
w[i][j] = 0;
}
}
if(curnum<minnum-1)
{
curnum++;
if(item == N)
{
minnum = curnum;
w[curnum][0]=item;
for(k1=1;k1<=curnum;k1++)
{
k2=0;
printf("%d:",k1);
while(w[k1][k2]!=0)
{
printf(" %d ",w[k1][k2]);
k2++;
}
printf("\n");
}
printf("\n");
w[curnum][0] = 0;
curnum--;
return;
}
else
{
w[curnum][0]=item;
addtowarehouse(item+1);
}
w[curnum][0] = 0;
curnum--;
}
return;
}
int main()
{
w[1][0]=1;
curnum = 1;
addtowarehouse(2);
printf("min number is %d\n",minnum);
}
lu_yb
2000-12-21
打赏
举报
回复
大概算法如此:)
#define N ...;
int a[N+1][N+1] = {...}; //关联矩阵,如果i和j发生反应a[i][j]=1
int w[N][N]; //仓库内容,初始化为全0
int minnum = N; //仓库最小数
int curnum = 0 ; //目前使用仓库数
void addtowarehouse(int item)
{
int i,j;
for(i=1;i<=curnum;i++)
{
j=0; //j代表i仓库中的第j个物品
while(w[i][j]!=0&&a[w[i][j]][item]!=1) //查看i仓库是否能放入item
j++;
if(w[i][j]==0) //如果能放入,则放入i仓库并递进
{
if(item==N)
{
minnum = curnum;
return;
}
else
{
w[i][j] = item;
addtowarehouse(item+1);
}
//如果发生递归,则从仓库中取出item
w[i][j] = 0;
}
}
//到此代表已有的仓库均不能放入item或者已经遍例过放入item的情况
//则加入一个仓库
if(curnum<minnum-1)
{
curnum++;
if(item == N)
{
minnum = curnum;
return;
}
else
{
w[curnum][0]=item;
addtowarehouse(item+1);
}
w[curnum][0] = 0;
curnum--;
}
return;
}
int main()
{
w[1][0]=1;
addwarehouse(2);
printf("min number is %d",minnum);
}
wistaria
2000-12-19
打赏
举报
回复
没有那么简单吧
这可以归成一个图论的问题
假定这N个物品是N个点,如果i,j(i!=j)不发生化学反映
就在i,j中画一条线。
那么如果有s个物品可以放在一个仓库中,那么这s个点
组成一个完全图。
要求的问题就是怎么把这N个点分组最少,而且每个组都是一个
完全图
eball
2000-12-19
打赏
举报
回复
n=1; //仓库数
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if (不发生反应){
put;
goto NEXTGOODS;
}
}
n+=1;
put;
NEXTGOODS:
}
结构之法算法之道全部博文集锦第三期CHM文件
此份CHM文件是从2010年10月11日至2011年7月8日,结构之法算法之道- CSDN博客内全部博文集锦的第三期CHM文件。
c语言常用算法集
几个不错的c语言算法
1000多种java算法大全源码包
1000多种java算法大全源码包
十三个经典算法研究PDF文档[带目录+标签]
本文件是十三个经典算法研究+红黑树系列的,带目录+标签的PDF文档。在此之前,网上绝无仅有。希望,对你有帮助。博客地址为:http://blog.csdn.net/v_JULY_v。
回溯法
大成!以
回溯法
实现
栈的出栈情况的遍历为例子,轻松帮你深刻领悟
回溯法
这里用
回溯法
实现
了 栈的出栈情况的遍历 。虽然这个题有更好的做法,但是你如果用
回溯法
做这道题,做完后一定会对
回溯法
有这更高境界的领悟,而且在整个设计算法,debug算法的过程中会感受到一种酣畅淋漓的快感。因为这个题看似很小,其实规模很大,要考虑方方面面的问题,很多很多。 上题。 输入一个序列 比如 123。你进栈的顺序必须是按照这个序列来,但是你可以这样,进1,然后在2进入前,把1出栈
数据结构与算法
33,028
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章