5-1 子集和
5 10
2 2 6 5 4
2 2 6
#include<bits/stdc++.h>
using namespace std;
#define MAX1 99999
int n,c,sum=0,bests=0,r=0;
int best[MAX1],x[MAX1],xx[MAX1];
void Backtrack(int i){
if(i>n){
if(sum>bests){
bests=sum;
for(int j=1;j<=n;j++) best[j]=x[j];
}
return;
}
if(sum+r>=bests){
if(sum+xx[i]<=c){
x[i]=1;
sum+=xx[i];
r-=xx[i];
Backtrack(i+1);
r+=xx[i];
sum-=xx[i];
x[i]=0;
}
Backtrack(i+1);
}
}
int main(){
cin>>n>>c;
for(int i=1;i<=n;i++){
cin>>xx[i];
r=r+xx[i];
}
Backtrack(1);
if(bests==c){
for(int i=1;i<n;i++){
if(best[i])
cout<<xx[i]<<" ";
}
}
else cout<<"No Solution!"<<endl;
return 0;
}
5-3 最小重量机器设计问题
#include<bits/stdc++.h>
#define MAX1 99999
using namespace std;
int n,m,d,rw=0,rc=0;
int bestw=MAX1,bestx[101],sumc=0,sumw=0,x[101];
int c[101][101]={0},w[101][101]={0},ww[101],cc[101];//ww存储每一行最小价格、重量
void Backtrack(int i){
if(i>n){
for(int j=1;j<=n;j++){
bestx[j]=x[j];
}
bestw=sumw;
return ;
}
for(int j=1;j<=m;j++){
sumc+=c[i][j];
sumw+=w[i][j];
x[i]=j;
rw=rw-ww[i];//求出后面部分最小重量 ,不计价格,若最小质量不满足,剪枝
rc=rc-cc[i];
if(sumc+rc<=d&&sumw+rw<bestw)
Backtrack(i+1);
rw=rw+ww[i];
rc=rc+cc[i];
sumc-=c[i][j];
sumw-=w[i][j];
}
}
int main()
{
cin>>n>>m>>d;//n个零件,m个供应商
for(int i=1;i<=n;i++){
int min1=MAX1;
for(int j=1;j<=m;j++){
cin>>c[i][j];//价格
min1=min(min1,c[i][j]);
}
cc[i]=min1;
rc=rc+cc[i];
}
for(int i=1;i<=n;i++){
int min1=MAX1;
for(int j=1;j<=m;j++){
cin>>w[i][j];//重量
min1=min(min1,w[i][j]);
}
ww[i]=min1;
rw=rw+ww[i];
}
Backtrack(1);
cout<<bestw<<endl;
for(int i=1;i<=n;i++){
cout<<bestx[i]<<" ";
}
return 0;
}
5-13 工作分配问题
输入数据
3
10 2 3
2 3 4
3 4 5
输出数据
6
我的代码
#include<bits/stdc++.h>
#define MAX1 9999
using namespace std;
int n,sumc,bestc=MAX1;
int c[101][101],x[MAX1],visit[MAX1];
void Backtrack(int i){
if(i>n&&sumc<bestc) bestc=sumc;
else{
for(int j=1;j<=n;j++){
if(visit[j]==0){
visit[j]=1;//第j个人已经有工作
sumc+=c[i][j];
Backtrack(i+1);
sumc-=c[i][j];
visit[j]=0;
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>c[i][j];
}
}
Backtrack(1);
cout<<bestc<<endl;
return 0;
}
看了看答案,要用排列树
#include<bits/stdc++.h>
#define MAX1 9999
using namespace std;
int n,bestc=MAX1;
int c[101][101],r[MAX1];
void Compute(){
int sumc=0;
for(int i=1;i<=n;i++){
sumc+=c[i][r[i]];
}
if(sumc<bestc) bestc=sumc;
}
void Backtrack(int i){
if(i>n) Compute();
else{
for(int j=i;j<=n;j++){
swap(r[i],r[j]);
Backtrack(i+1);
swap(r[i],r[j]);
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
r[i]=i;
for(int j=1;j<=n;j++){
cin>>c[i][j];
}
}
Backtrack(1);
cout<<bestc<<endl;
return 0;
}
5-15 最佳调度问题
7 3
2 14 4 16 6 5 3
17
#include<bits/stdc++.h>
#define MAX1 9999
using namespace std;
int t[MAX1],jq[MAX1];
int n,k,best=MAX1;
int con(){
int temp=0;
for(int i=1;i<=k;i++){
temp=max(temp,jq[i]);
}
return temp;
}
void Backtrack(int i){
if(i>n){
int temp=con();
if(temp<best)
best=temp;
return ;
}
for(int j=1;j<=k;j++){
jq[j]+=t[i];
if(jq[j]<best)
Backtrack(i+1);
jq[j]-=t[i];
}
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>t[i];
}
Backtrack(1);
cout<<best;
return 0;
}