第五章实践

7-1 0-1背包 (20 分)

给定n(n<=100)种物品和一个背包。物品i的重量是wi,价值为vi,背包的容量为C(C<=1000)。问:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。

 

#include<cstdio>
#include<iostream>
using namespace std;
int x[100];
template<class Type>class Loading{

friend Type MaxLoading(Type[], Type,int);
public:
void Backtrack(int i);
int n;
Type *w,c,cw,bestw;
};
template<class Type>
void Loading<Type>::Backtrack(int i)
{
if(i>n){
if(cw>bestw)
bestw=cw;
//cout<<i<<endl;
return;
}
if(cw+w[i]<=c)
{
//cout<<w[i]<<endl;
x[i]=1;
cw+=w[i];
Backtrack(i+1);
cw-=w[i];
//x[i]=0;
//cout<<1;
}
Backtrack(i+1);
}
template<class Type>
Type MaxLoading(Type w[],Type c,int n)
{
Loading <Type> X;
X.w=w;
for(int i=0;i<=3;++i)
cout<<"w["<<i<<"]="<<X.w[i]<<endl;//测试输出
X.c=c;
X.n=n;
X.bestw=0;
X.cw=0;
X.Backtrack(1);
//cout<<X.bestw<<endl;
return X.bestw;
}
int main()
{
int n=3;
int w[]={0,1,3,9};
//for(int i=0;i<4;++i)
//cout<<w[i]<<endl;
int c=10;
//Loading load;
cout<<MaxLoading(w,c,n)<<endl;
}

这个程序一直编译不出来,问了搭档她也看不出来
7-2 工作分配问题 (20 分)

设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。

源代码

#include<cstdio>
#include<iostream>
using namespace std;
#define CHUZ 1<<23;
int n, m;
int a[21][21], vis[21] = {0};
void dfs(int i, int cnt)
{
if(cnt > m)return ;
if(i == n)
{
m = (cnt < m ? cnt : m);
return ;
}
for(int j = 0; j < n; j++)
{
if(!vis[j])
{
vis[j] = 1;
dfs(i + 1, cnt + a[i][j]);
vis[j] = 0;
}
}
}
int main()
{
int i, j;
while(scanf("%d", &n) != EOF)
{
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
scanf("%d", &a[i][j]);
m = CHUZ;
dfs(0, 0);
printf("%d\n", m);
}
return 0;
}

i是第i个工作,j是分到的第j个工作,a[i][j]指第i个工人分到第j个工作的费用。

 

posted on 2018-12-24 18:45  计科一俞崔雯  阅读(307)  评论(0编辑  收藏  举报