
无语了:error C2501: 'cout' : missing storage-class or type specifiers
#include<iostream>usingnamespacestd;constintn=5;//物品数目constintC=10;//背包容量intj=0;//背包剩...
#include<iostream>
using namespace std;
const int n=5;//物品数目
const int C=10;//背包容量
int j=0;//背包剩余容量
int v[n+1]={0};//物品的价值
int w[n+1]={0};//物品的重量
int m[n+1][C+1]={0};//从第i个背包到第n个背包的最大价值,也是所求背包问题的最优解的前提条件
int x[n+1]={0};//x为0-1数组向量,依次来记录第i个物品是否需要被放入背包中
cout<<"依次输入 "<<n<<" 个物品的重量:";
for(int i=1;i<=n;i++)
{
cin>>w[i];
}
cout<<"依次输入 "<<n<<" 个物品的价值:";
for(int i=1;i<=n;i++)
{
cin>>v[i];
}
//下面是背包问题的函数实现
void Knapsack(int v[],int w[],int m[][C+1])
{
//第i个物品可否装入背包,取决于能否使后面从 i 到 n 个装入背包的物品总价值价值达到最大值
//
for(int j=0;j<=C;j++)
{
if(w[n]>j)m[n][j]=0;
else m[n][j]=v[n];
}
//最后一个物品的最优解情况已经确定,接下来就可以对从(n-1)进行探讨
for(int i=n-1;i>1;i--)//想想这里为什么是循环条件是(i>1 )?通过手工画图可知,对当i==1时,仅需要计算
//j== 10即可,故其他的不需要计算,那么当i==1的这一行便无需计算,在下面的循环结束后
//再计算m[1][C]即可。
for(int j=0;j<=C;j++)
{
if(m[i+1][j]>(m[i+1][j-w[i]]+v[i]))//将第i个物品不装入背包可使得背包中物品价值最大
m[i][j]=m[i+1][j];
else
m[i][j]=m[i+1][j-w[i]]+v[i];//将第i个物品装入背包后可使得背包中物品价值最大;
}
//计算m[1][C]的结果
if(m[2][C]>(m[2][C-w[1]]+v[1])) m[1][C]=m[2][C];
else m[1][C]=m[2][C-w[1]]+v[1];
}
//构造最优解
void Traceback(int m[][C+1],int i,int j,int n )
{
for(int i=1;i<n;i++)
{
if(m[i][j]=m[i+1][j])x[i]=0;
else {x[i]==1;j-=w[i];}
}
x[n]=m[n][j]?1:0;
cout<<"输出最优解:";
cout<<"( "<<x[1];
for(int i=2;i<=n;i++)
{
cout<<","<<x[i];
}
cout<<" )";
}
int main()
{
Knapsack(v,w,m);
Traceback(m,1,0,n);
return 0;
}
0-1背包问题 展开
using namespace std;
const int n=5;//物品数目
const int C=10;//背包容量
int j=0;//背包剩余容量
int v[n+1]={0};//物品的价值
int w[n+1]={0};//物品的重量
int m[n+1][C+1]={0};//从第i个背包到第n个背包的最大价值,也是所求背包问题的最优解的前提条件
int x[n+1]={0};//x为0-1数组向量,依次来记录第i个物品是否需要被放入背包中
cout<<"依次输入 "<<n<<" 个物品的重量:";
for(int i=1;i<=n;i++)
{
cin>>w[i];
}
cout<<"依次输入 "<<n<<" 个物品的价值:";
for(int i=1;i<=n;i++)
{
cin>>v[i];
}
//下面是背包问题的函数实现
void Knapsack(int v[],int w[],int m[][C+1])
{
//第i个物品可否装入背包,取决于能否使后面从 i 到 n 个装入背包的物品总价值价值达到最大值
//
for(int j=0;j<=C;j++)
{
if(w[n]>j)m[n][j]=0;
else m[n][j]=v[n];
}
//最后一个物品的最优解情况已经确定,接下来就可以对从(n-1)进行探讨
for(int i=n-1;i>1;i--)//想想这里为什么是循环条件是(i>1 )?通过手工画图可知,对当i==1时,仅需要计算
//j== 10即可,故其他的不需要计算,那么当i==1的这一行便无需计算,在下面的循环结束后
//再计算m[1][C]即可。
for(int j=0;j<=C;j++)
{
if(m[i+1][j]>(m[i+1][j-w[i]]+v[i]))//将第i个物品不装入背包可使得背包中物品价值最大
m[i][j]=m[i+1][j];
else
m[i][j]=m[i+1][j-w[i]]+v[i];//将第i个物品装入背包后可使得背包中物品价值最大;
}
//计算m[1][C]的结果
if(m[2][C]>(m[2][C-w[1]]+v[1])) m[1][C]=m[2][C];
else m[1][C]=m[2][C-w[1]]+v[1];
}
//构造最优解
void Traceback(int m[][C+1],int i,int j,int n )
{
for(int i=1;i<n;i++)
{
if(m[i][j]=m[i+1][j])x[i]=0;
else {x[i]==1;j-=w[i];}
}
x[n]=m[n][j]?1:0;
cout<<"输出最优解:";
cout<<"( "<<x[1];
for(int i=2;i<=n;i++)
{
cout<<","<<x[i];
}
cout<<" )";
}
int main()
{
Knapsack(v,w,m);
Traceback(m,1,0,n);
return 0;
}
0-1背包问题 展开
若以下回答无法解决问题,邀请你更新回答
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询