利用蠻力法解決最近對問題
阿新 • • 發佈:2019-01-08
#include<iostream>
#include<stack>
#include<vector>using namespace std;stack<int> KnapSack(int c,vector<int> w,vector<int> v,int &max_m)
{
vector<vector <int> > m(w.size(),vector<int>(c+1));
stack<int> res;
int i,j; max_m=0;
for(j=0;j<c+1;j++) //對於m[n][j],
if(j<w[w.size()-1])
m[w.size()-1][j]=0; //當j<w[n]時,物品n不能放入揹包中,此時揹包的價值為0。
else
m[w.size()-1][j]=v[v.size()-1]; //當j>=w[n]時,物品n可以放入揹包,此時揹包的價值為v[n] for(i=w.size()-2;i>=0;i--) //對於m[i][j],
{
for(j=0;j<c+1;j++)
if(j<w[i]) //當j<w[i]時,物品i不能放入揹包中,此時揹包的價值為m[i+1][j]。
m[i][j]=m[i+1][j];
else //當j>=w[i]時,物品n可以放入揹包
{
int m1=m[i+1][j]; //當物品i不放入揹包時,能達到的最大價值為m[i+1][j]
int m2=m[i+1][j-w[i]]+v[i]; //當物品i放入揹包後,對於物品i+1到n,能達到的最大價值為m[i+1][j-w[i]]+v[i]
m[i][j]=m1>m2?m1:m2; //兩者取其大者
}
}
/* cout << "最優值矩陣:"<<endl;
for(i=0;i<w.size();i++)
{
for(j=0;j<c+1;j++)
cout<<m[i][j]<<" ";
cout <<endl;
}
cout <<endl;
*/
j=c;
for(i=0;i<w.size()-1;i++)
{
if(m[i][j]!=m[i+1][j])
{
res.push(i+1);
max_m+=v[i];
j=j-w[i];
}
}
if(m[w.size()-1][j]!=0)
{
res.push(w.size());
max_m+=v[w.size()-1];
} return res;
}int main()
{
vector<int> weight;
vector<int> value;
stack<int> result;
int max_weight;
int tmp;
int result_m=0; cout<< "輸入揹包最大容量"<<endl;
cin >> max_weight;
cout <<"輸入物品重量,以0結束"<<endl; while(1)
{
cin>>tmp;
if(tmp!=0)
weight.push_back(tmp);
else
break;
}
cout <<"物品重量: "<<endl;
for(int i=0;i<weight.size();i++)
cout <<weight[i]<<" ";
cout << endl;
cout <<"輸入物品權重,以0結束"<<endl;
while(1)
{
cin>>tmp;
if(tmp!=0)
value.push_back(tmp);
else
break;
} cout <<"物品權重: "<<endl;
for(int i=0;i<value.size();i++)
cout <<value[i]<<" ";
cout << endl; result=KnapSack(max_weight,weight,value,result_m); cout <<"放入揹包的物品為:"<<endl;
while(!result.empty())
{
cout <<result.top()<<" ";
result.pop();
}
cout <<endl;
cout<<"揹包最大價值為:"<<result_m<<endl; return 0;
}
#include<stack>
#include<vector>using namespace std;stack<int> KnapSack(int c,vector<int> w,vector<int> v,int &max_m)
{
vector<vector <int> > m(w.size(),vector<int>(c+1));
stack<int> res;
int i,j; max_m=0;
for(j=0;j<c+1;j++) //對於m[n][j],
if(j<w[w.size()-1])
m[w.size()-1][j]=0; //當j<w[n]時,物品n不能放入揹包中,此時揹包的價值為0。
else
m[w.size()-1][j]=v[v.size()-1]; //當j>=w[n]時,物品n可以放入揹包,此時揹包的價值為v[n] for(i=w.size()-2;i>=0;i--) //對於m[i][j],
{
for(j=0;j<c+1;j++)
if(j<w[i]) //當j<w[i]時,物品i不能放入揹包中,此時揹包的價值為m[i+1][j]。
m[i][j]=m[i+1][j];
else //當j>=w[i]時,物品n可以放入揹包
{
int m1=m[i+1][j]; //當物品i不放入揹包時,能達到的最大價值為m[i+1][j]
int m2=m[i+1][j-w[i]]+v[i]; //當物品i放入揹包後,對於物品i+1到n,能達到的最大價值為m[i+1][j-w[i]]+v[i]
m[i][j]=m1>m2?m1:m2; //兩者取其大者
}
}
/* cout << "最優值矩陣:"<<endl;
for(i=0;i<w.size();i++)
{
for(j=0;j<c+1;j++)
cout<<m[i][j]<<" ";
cout <<endl;
}
cout <<endl;
*/
j=c;
for(i=0;i<w.size()-1;i++)
{
if(m[i][j]!=m[i+1][j])
{
res.push(i+1);
max_m+=v[i];
j=j-w[i];
}
}
if(m[w.size()-1][j]!=0)
{
res.push(w.size());
max_m+=v[w.size()-1];
} return res;
}int main()
{
vector<int> weight;
vector<int> value;
stack<int> result;
int max_weight;
int tmp;
int result_m=0; cout<< "輸入揹包最大容量"<<endl;
cin >> max_weight;
cout <<"輸入物品重量,以0結束"<<endl; while(1)
{
cin>>tmp;
if(tmp!=0)
weight.push_back(tmp);
else
break;
}
cout <<"物品重量: "<<endl;
for(int i=0;i<weight.size();i++)
cout <<weight[i]<<" ";
cout << endl;
cout <<"輸入物品權重,以0結束"<<endl;
while(1)
{
cin>>tmp;
if(tmp!=0)
value.push_back(tmp);
else
break;
} cout <<"物品權重: "<<endl;
for(int i=0;i<value.size();i++)
cout <<value[i]<<" ";
cout << endl; result=KnapSack(max_weight,weight,value,result_m); cout <<"放入揹包的物品為:"<<endl;
while(!result.empty())
{
cout <<result.top()<<" ";
result.pop();
}
cout <<endl;
cout<<"揹包最大價值為:"<<result_m<<endl; return 0;
}