问题描述
- c++编译错误。怎么办?
-
/*描述:有一批共n个集装箱要装上两艘载重量分别为c1和c2的轮船,其中,集装箱i的重量为wi,且
集装箱重量总和小于等于两辆轮船的载重量总和。
装在问提要求确定是否存在一个方案可将这n个集装箱装上两艘轮船。
若有,找出一种装在方案。解决方法:(1)首先将第一艘轮船极可能装满
(2)将其余的集装箱装载第二艘轮船装载第一艘轮船的方法等价于一个特殊的0-1背包问题
*/
#includeusing namespace std;
int c1[100], c2[100];//两艘轮船的载重量
int n[100];//集装箱个数
int w[1000];//每个集装箱的重量
int bestw = 0;//记录当前第一搜轮船装载的最大值
int a[1000];//记录每个集装箱是否被装进第一搜轮船//插入排序
void InsertSort(int A[], int N)
{
int j, p;
int tmp;for(p = 1; p < N; p++) { tmp = A[p]; for(j = p; j > 0 && A[j - 1] > A[j]; j--) { A[j] = A[j - 1]; } A[j] = tmp; }
}
void search(int m)
{
if(m >= n)//这里提示有问题
return;
else {
if(w[m] <= c1 - bestw)//这里提示有问题
{
a[m] = 1;
bestw = bestw + w[m];
}else a[m] = 0; search(m + 1); }
}
//判断函数
bool outp(int c1, int C2, int N)
{
int i;
//对集装箱的重量进行插入排序
InsertSort(w, N);//将将第一个集装箱尽可能装满 search(0); int wz = 0;//集装箱总重量 for(i = 0; i < N; i++) { wz = wz + w[i]; } //做出判断 if(C2 >= wz - bestw) return true; else return false;
}
int main()
{
int i = -1, j;
do {
i++;
cin >> c1[i] >> c2[i] >> n[i];//输入载重量和集装箱的个数
int i;//循环变量
for(j = 0; j < n[i]; j++) {
//输入每个集装箱的重量
cin >> w[i];
}
}while(c1[i] || c2[i] || n[i]);int tmp = i; for(i = 0; i < tmp; i++) { if(outp(c1[i], c2[i], n[i])) cout << "Yes" << endl; else cout << "No" << endl; } return 0;
}
编译提示
error: ISO C++ forbids comparison between pointer and integer
解决方案
程序1
Input:n个集装箱,及其重量wi;两艘轮船的载重量C1,C2。
Output:一种装载方案,没有输出没有解。
1. 设定目标函数的限界down=w1,up= ??n iiw1 ,flag=false(标记是否找到解)
2. 计算初始结点1的f(1)=up和g(1)=0,将初始结点插入最大堆H,堆中存储f值为结点键值;
3. while (H ≠Φ)
4. {
5. 从H中做DELETEMAX的操作,用p带回相应结点;
6. If g(p)<=C1 and up-g(p)<=C2 then
7. 沿parent指针输出装入第一艘轮船的集装箱, 剩余装入第二艘轮船,flag=true,exit (结束程序);
8. Else if g(p)<=C1 and up-g(p)>C2
9. { if p为叶子结点 then
10. if 堆H为空then 输出没有解, exit (结束程序);
11. else if f(p)>down then down=f(p), 删除H中小于等于down的结点;
12. else
13. { 产生p满足约束条件的后继结点d(建树,保留结点的parent指针) 并计算f(d)和g(d)
14. 将f值大于down的结点插入最大堆H中;}
15. }
16. }
17. if flag=false then 输出没有解;
解决方案二:
程序2
[cpp] view plaincopyprint?
template
class Loading{
friend Type MaxLoading(Type [],Type ,int);
private:
void Backtrack(int i);
int n; //集装箱数
Type * w, //集装箱重量数组
c , //第一艘轮船的载重量
cw , //当前载重量
bestw; //当前最优载重量
};
template
void Loading::Backtrack(int i)
{
if(i>n)
{//到达叶子节点
if(cw>bestw) bestw=cw;
return;
}
//搜索子树
if(cw+w[i]<=c)
{//x[i] =1;
cw+=w[i];
Backtrack(i+1);
cw-=w[i];
}
Backtrack(i+1);//x[i]=0;
}
template
Type MaxLoading(Type w[],Type c,int n)
{
Loading X;
X.w = w;
X.c =c;
X.n =n;
X.bestw =0;
X.cw =0;
X.Backtrack(1);
return X.bestw;
}
解决方案三:
程序3
设Z是解空间树第i层上的一个当前扩展结点,curw是当前载重量,maxw是已经得到的最优载重量
#include
#include
using namespace std;
const int N = 1024;
int w[N]; // Weight
int c;
int n;
int curw; // current weight
int maxw; // max weight
int x[N]; // result
int best[N];
int rest;
void Backtrack(int t)
{
if(t>=n)
{
maxw = curw>maxw ? curw : maxw;
for(int i=0; i<n; i++)
best[i] = x[i];
}
else
{
rest -= w[t];
if(curw+w[t] <= c && curw+w[t]+rest > maxw)
{
x[t] = 1;
curw += w[t];
Backtrack(t+1);
curw -= w[t];
}
if(curw+rest > maxw)
{
x[t] = 0;
Backtrack(t+1);
}
rest += w[t];
}
}
int main()
{
maxw = curw = 0;
cin>>c;
cin>>n;
assert(n
for(int i=0; i
{
cin>>w[i];
rest += w[i];
}
Backtrack(0);
cout<<"MaxLoad Weight: "<<maxw<<endl;
for(int i=0; i<n; i++)
{
cout<<best[i]<<" ";
}
cout<<endl;
return 0;
}
解决方案四:
两种不同类型的数据无法比较。
楼主双击错误,跳到错误的那行,然后修改之