/*问题描述:有 N 件物品 d1,......dN,每件物品重量为 W1,..., WN
(Wi > 0), 每件物品价值为 V1,......VN (Vi>0)。用这N件物品的某个子集
填空背包,使得所取物品的总重量<=TOTAL,并设法使得背包中物品的价值尽可
能高。
*/
//0-1背包问题..,物品不可分割;可分割物品的背包问题可采用贪心算法。
- #include<iostream>
- using namespace std;
- #define N 5 //N件物品
- bool RSet[N],Set[N];
- float W[N],V[N],TOTAL,VALUE;
- int main(){
- void Process(int n,float Sum,float Total_Value);
- bool Set[N];
- cout<<"请输入这"<<N<<" 件物品的重量(>0)!"<<endl;
- for(int i=0;i<N;i++)cin>>W[i];
- cout<<"请输入这"<<N<<" 件物品的价值(>0)!"<<endl;
- for(i=0;i<N;i++)cin>>V[i];
- cout<<"请输入背包的背重!"<<endl;
- cin>>TOTAL;
- for(i=0;i<N;i++){/*初始化*/
- Set[i]=false;
- RSet[i]=false;
- }
- VALUE=0;
- Process(0,0,0);
- cout<<"装入背包的物品为:"<<endl;
- for(i=0;i<N;i++)if(RSet[i])cout<<i+1<<endl;
- return 0;
- }
- void Process(int n,float Sum,float Total_Value){
- if(n==N){
- if(Total_Value>VALUE){
- for(int i=0;i<N;i++)RSet[i]=Set[i];//记录此次装载情况
- VALUE=Total_Value;
- }
- return ;
- }
- else {
- if(Sum+W[n]<=TOTAL){
- Set[n]=true;//加入
- Process(n+1,Sum+W[n],Total_Value+V[n]);
- Set[n]=false;
- Process(n+1,Sum,Total_Value);
- }
- else {
- Process(n+1,Sum,Total_Value);
- }
- }
- }