社区
数据结构与算法
帖子详情
如何用回溯法实现
hyqryq
2000-12-19 02:23:00
有一批物品共N个,不发生化学反应的可以放在同一个仓库,求一种放物品的方法,
可以用最少的仓库.
...全文
221
9
打赏
收藏
如何用回溯法实现
有一批物品共N个,不发生化学反应的可以放在同一个仓库,求一种放物品的方法, 可以用最少的仓库.
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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文件
5. **贪心算法与
回溯法
**:介绍在特定问题中如何运用贪心策略求解,以及
回溯法
在解决组合问题中的应用。 6. **字符串处理**:包括字符串匹配算法(如KMP、Boyer-Moore)、文本处理和编码转换等相关知识。 7. **...
c语言常用算法集
回溯法
通常用于解决组合优化问题,如数独、棋盘覆盖等。 7. **字符串处理**:虽然C语言的字符串处理相对复杂,但CH10和CH16可能包含了一些字符串处理的算法,如KMP算法、Rabin-Karp字符串匹配等。 8. **数值计算与...
1000多种java算法大全源码包
- **深度优先搜索(DFS)**:用于图和树的遍历,常与
回溯法
结合。 - **广度优先搜索(BFS)**:同样用于图和树的遍历,常用于求最短路径。 - **哈希查找**:通过哈希函数快速定位元素。 4. **图算法** - **...
十三个经典算法研究PDF文档[带目录+标签]
6. **
回溯法
**:在解决如八皇后问题、N皇后问题这类组合优化问题时,
回溯法
是一种有效的策略,通过试探性的构建解决方案并适时回退以避免死胡同。 7. **红黑树**:是一种自平衡的二叉查找树,它的设计确保了插入、...
回溯法
大成!以
回溯法
实现
栈的出栈情况的遍历为例子,轻松帮你深刻领悟
回溯法
这里用
回溯法
实现
了 栈的出栈情况的遍历 。虽然这个题有更好的做法,但是你如果用
回溯法
做这道题,做完后一定会对
回溯法
有这更高境界的领悟,而且在整个设计算法,debug算法的过程中会感受到一种酣畅淋漓的快感。...
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章