这是个很重要的算法,记录一下这些代码,以便能随时回忆思路
子集和问题
问题描述
代码及思路
最佳调度问题
问题描述
代码及思路
#include <iostream>
using namespace std;
int maxnum = 100000;
int n,k;
int a[100];//作业
int m[100];//机器
void backtrack(int t){
if(t > n)
{
int temp = 0;
for(int i=1; i<=k; i++)
{
if(m[i]>temp)
temp = m[i];
}
if(maxnum>temp)
{
maxnum = temp;
}
}
else
{
for(int i=1; i<=k; i++)
{
m[i]+=a[t];
if(m[i]<=maxnum)
backtrack(t+1);
m[i]-=a[t];
}
}
}
int main(){
cin >> n >> k;
for(int i=1; i<=n; i++)
{
cin >> a[i];
}
backtrack(1);
cout << maxnum;
return 0;
}
部落卫队问题
问题描述
输入样例:
7 10
1 2
1 4
2 4
2 3
2 5
2 6
3 5
3 6
4 5
5 6
输出样例:
3
1 0 1 0 0 0 1
代码及思路
#include<iostream>
#include<cstring>
using namespace std;
int m[200][200];//m[i][j]=1表示i,j有仇
int x[200],cn = 0;//x[i]为1表示已选择
int bestx[200],bestn = 0;//最佳选择
int n,rn;
bool judge(int k)
{
bool flag = true;
for(int i=1; i<=k; ++i)
{
if(x[i]&&m[i][k]==1)
{
flag = false;
break;
}
}
return flag;
}
void dfs(int t)
{
if(t>n)
{
for(int i=1; i<=n; i++)
bestx[i]=x[i];
bestn=cn;
return;
}
if(judge(t))//如果满足约束条件,生成左子树
{
x[t]=1;
cn++;
dfs(t+1);
cn--;
}
if(cn+n-t>bestn)//如果满足限界条件,生成右子树
{
x[t]=0;
dfs(t+1);
}
}
int main()
{
cin>>n>>rn;
int i,a,b;
memset(m,0,sizeof(m));
memset(x,0,sizeof(x));
memset(bestx,0,sizeof(bestx));
for(i=1; i<=rn; i++)
{
cin >> a >> b;
m[a][b] = 1;
}
dfs(1);
cout << bestn <<endl;
for(i=1; i<=n; i++)
{
if(bestx[i])
cout<<1;
else
cout<<0;
cout<<" ";
}
return 0;
}
最小重量机器设计问题
问题描述
输入样例:
3 3 4
1 2 3
3 2 1
2 2 2
1 2 3
3 2 1
2 2 2
输出样例:
4
1 3 1
代码及思路
#include<iostream>
using namespace std;
int w[100][100];//w[i][j]为第i个零件在第j个供应商的重量
int c[100][100];//c[i][j]为第i个零件在第j个供应商的价格
int bestx[100];//bestx[i]表示一次搜索到底后的最优解,用来存放第i个零件的供应商,
int x[100];//x[i]临时存放第i个零件的供应商
int cw=0,cc=0,bestw=10000;
int cost;//限定价格
int n;//部件数
int m;//供应商数
void Backtrack(int t)
{
int j;
if(t>n)//搜索到叶子结点,一个搜索结束,所有零件已经找完
{
bestw=cw;//当前最小重量
for(j=1;j<=n;j++)
bestx[j]=x[j];
}
else
{
for(j=1;j<=m;j++)
{
if(cc+c[t][j]<=cost && cw+w[t][j]<bestw)
{
x[t]=j;
cc+=c[t][j];
cw+=w[t][j];
Backtrack(t+1);
cc-=c[t][j];
cw-=w[t][j];
}
}
}
}
int main()
{
int i,j;
cin>>n;
cin>>m;
cin>>cost;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
cin>>c[i][j];
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
cin>>w[i][j];
Backtrack(1);
cout<<bestw<<endl;
for(i=1;i<=n;i++)
cout<<bestx[i]<<' ';
return 0;
}