一、实验目的
1、理解和复习所学各种算法的概念;
2、 掌握和复习所学各种算法的基本要素;
3、 掌握各种算法的优点和区别;
4、 通过应用范例掌握选择最佳算法的设计技巧与策略;
二、实验内容
1、使用贪心算法、回溯法、分支限界法解决箱子装载问题。(任选两种)
2、通过上机实验进行算法实现。
3、保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。
三、程序代码
回溯算法
#include<bits/stdc++.h>
using namespace std;
int n; //集装箱数
int cw; // 当前装载重量
int bestw; //最优重量
int c1; //轮船的载重量
int x[100]; //解
int bestx[100]; //最优解
int w[100]; //重量
void load(int t,int sumw)
{
if (t >= n)
{
if (cw > bestw)
{
bestw = cw;
for (int i = 0; i < n; i++)
bestx[i] = x[i];
}
return;
}
else
{
if (cw + w[t] <= c1 && sumw+cw > bestw)
{
cw += w[t];
x[t] = 1;
load(t + 1,sumw-w[t]);
x[t] = 0;
cw -= w[t];
}
load(t + 1,sumw);
}
}
int main()
{
while(1)
{
for(int i=0;i<100;i++) x[i]=0;
cout << "回溯法:" << endl;
cout << "船载重量为:";
cin>>c1;
cout << "集装箱个数为:";
cin >> n;
int sumw=0; //剩余未装载量
for (int i = 0; i < n; i++){
cout << "请输入第"<<i+1<<"个集装箱重量:";
cin >> w[i];
sumw+=w[i];
}
cw = 0;
bestw = 0;
load(0,sumw);
cout << "船的最优载重量为:" << bestw << endl;
cout << "船的最优装载方案为:"<<endl;
for (int i = 0; i < n; i++)
{
if(bestx[i]==1)
cout <<"装入第"<< i+1<< "个集装箱"<< endl;
}
system("pause");
}
}
贪心算法
#include<bits/stdc++.h>
using namespace std;
int n; //集装箱数
int cw; // 当前装载重量
int bestw; //最优重量
int c1; //轮船的载重量
int x[100]; //解
int w[100]; //重量
bool compare(int a,int b){return a>b;}
void load() {
sort(w,w+n,compare);
for (int i = 0; i< n ; i++) {
if (cw+w[i] <= c1) {
x[i] = 1;
cw += w[i];
}
}
}
int main() {
for(int i=0;i<100;i++) x[i]=0;
cout << "贪心算法:" << endl;
cout << "船载重量为:";
cin>>c1;
cout << "集装箱个数为:";
cin >> n;
for (int i = 0; i < n; i++){
cout << "请输入第"<<i+1<<"个集装箱重量:";
cin >> w[i];
}
cw = 0;
load();
bestw=cw;
cout << "船的最优载重量为:" << bestw << endl;
cout << "船的最优解为:";
for (int i = 0; i < n; i++)
{
if(x[i]==1) cout<<w[i]<<" ";
}
cout << endl;
system("pause");
return 0;
}