背包问题是一个经典的问题,到现在还没有多项式时间的算法去解决它.本文是背包问题的贪心算法,当然是一个非多项式算法.
#include
<
iostream
>
#include < vector >
#include < algorithm >
using namespace std;
struct Treasure
... {
int no;
int quantity;
int price;
int value;
} ;
bool is_great_than ( const Treasure & t1, const Treasure & t2 )
... {
if ( t1.value > t2.value ) return true;
else return false;
}
struct ThiefBag
... {
struct Got_Treasure
...{
int no;
int quantity;
};
int quantity_of_big;
vector< Got_Treasure > vgt;
} ;
int main ( int argc, char * argv[] )
... {
vector< Treasure > vt;
ThiefBag thief;
ThiefBag::Got_Treasure gt;
Treasure trea;
int quantity = 0;
int price;
for (int i = 0; i < 4; ++i) ...{
cin >> quantity >> price;
trea.no = i;
trea.quantity = quantity;
trea.price = price;
trea.value = price / quantity;
vt.push_back ( trea );
}
cin >> thief.quantity_of_big;
sort ( vt.begin(), vt.end(), is_great_than );
for ( vector<Treasure>::iterator itr = vt.begin();
itr != vt.end() && thief.quantity_of_big > 0;
++ itr ) ...{
if ( (*itr).quantity >= thief.quantity_of_big ) ...{
gt.no = (*itr).no;
gt.quantity = thief.quantity_of_big;
thief.vgt.push_back(gt);
thief.quantity_of_big = 0;
(*itr).quantity -= thief.quantity_of_big;
break;
}
gt.no = (*itr).no;
gt.quantity = (*itr).quantity;
thief.vgt.push_back(gt);
thief.quantity_of_big -= (*itr).quantity;
(*itr).quantity = 0;
}
cout << "NO. " << "quantity " << endl;
for ( vector<ThiefBag::Got_Treasure>::iterator itr = thief.vgt.begin();
itr != thief.vgt.end(); ++ itr ) ...{
cout << (*itr).no << " " << (*itr).quantity << endl;
}
system("pause");
return 0;
}
#include < vector >
#include < algorithm >
using namespace std;
struct Treasure
... {
int no;
int quantity;
int price;
int value;
} ;
bool is_great_than ( const Treasure & t1, const Treasure & t2 )
... {
if ( t1.value > t2.value ) return true;
else return false;
}
struct ThiefBag
... {
struct Got_Treasure
...{
int no;
int quantity;
};
int quantity_of_big;
vector< Got_Treasure > vgt;
} ;
int main ( int argc, char * argv[] )
... {
vector< Treasure > vt;
ThiefBag thief;
ThiefBag::Got_Treasure gt;
Treasure trea;
int quantity = 0;
int price;
for (int i = 0; i < 4; ++i) ...{
cin >> quantity >> price;
trea.no = i;
trea.quantity = quantity;
trea.price = price;
trea.value = price / quantity;
vt.push_back ( trea );
}
cin >> thief.quantity_of_big;
sort ( vt.begin(), vt.end(), is_great_than );
for ( vector<Treasure>::iterator itr = vt.begin();
itr != vt.end() && thief.quantity_of_big > 0;
++ itr ) ...{
if ( (*itr).quantity >= thief.quantity_of_big ) ...{
gt.no = (*itr).no;
gt.quantity = thief.quantity_of_big;
thief.vgt.push_back(gt);
thief.quantity_of_big = 0;
(*itr).quantity -= thief.quantity_of_big;
break;
}
gt.no = (*itr).no;
gt.quantity = (*itr).quantity;
thief.vgt.push_back(gt);
thief.quantity_of_big -= (*itr).quantity;
(*itr).quantity = 0;
}
cout << "NO. " << "quantity " << endl;
for ( vector<ThiefBag::Got_Treasure>::iterator itr = thief.vgt.begin();
itr != thief.vgt.end(); ++ itr ) ...{
cout << (*itr).no << " " << (*itr).quantity << endl;
}
system("pause");
return 0;
}