搜索优化思想-数据有序化(学习)

1.为什么进行数据有序化? 数据有序化实现简单,优化效果好,与其他优化方法不冲突,可拓展性很强,行之有效的原因是初始解距离最优解最近(贪心思想)

而普通搜索之所以慢则是穷竭搜索

2.例题1:装箱问题:n个物品,箱子体积为v,每个物品无限个,最少多少个装满?有序化后代码:#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1002;
int n,v,w[maxn],ans;
bool flag;
bool cmp(int a,int b){ return (a>b);}
void init(){
scanf("%d%d",&n,&v);
for (int i=1;i<=n;i++) scanf("%d",&w[i]);
flag=1;
}


void dfs(int dep,int x,int num){
if (x==v) { flag=0; ans=num; return;}
if (dep>n||x>v) return; 
for (int i=(v-x)/w[dep];i>=0;i--)
 if (!flag) return;
 else dfs(dep+1,x+i*w[dep],num+i); 
}
int main(){
init();
sort(w+1,w+n+1,cmp);
dfs(1,0,0);
printf("%d",ans);
return 0;

还有几组随机数据的效率比较

3.一个原则和方法:读论文,读书,书中的定理和练习先不看,自己尝试证明,尝试思考出来,论文中的例题先自己做,完事之后,看看和作者的差距在哪,有时差得太多但不要灰心,因为这正说明你需要在这方面有所努力,体会作者的思想,学完后,以前不会的不仅会了,而且知道为什么不会,有自己的思考和体验,这才是学会

4.回到正题:积木搭建和n皇后问题变化,都是搜索题,然而我搜索弱爆了因此啥都不会,想不出来,大概感受一下,就是将棋盘或空间编号,然后,,,,让我们来看正解吧

5.简述一下基本思路:积木搭建,就是给每种积木的每个积木编号,给目标积木编号,将积木搭建问题转为集合不相交覆盖问题,,,但我并不太明白编号那块

n皇后同构问题:这个还可以,将每列皇后所在行为编号,生成n!个排列(贪心从小到大),生成一个排列,先检查一下能否放下,再做变换求得最小表示法,若最小表示法从未出现(未在以前搜索出现)过则答案加1,流程:生成排列,检查合法与否,进行变换比较,程序有时间会实现,不过漏洞很多,,竟然对于生成排列和组合不是很清楚,,,学习

你可能感兴趣的:(搜索优化思想-数据有序化(学习))