#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define M 105
int n;
int W;
double w[M];
double v[M];
bool x[M];
double cw;
double cp;
double bestp;
bool bestx[M];
double Bound(int i)
{
int rp=0;
while(i<=n)
{
rp+=v[i];
i++;
}
return cp+rp;
}
void Backtrack(int t)
{
if(t>n)
{
for (int j=1;j<=n;j++)
{
bestx[j]=x[j];
}
bestp=cp;
return;
}
if(cw+w[t]<=W)
{
x[t]=1;
cw+=w[t];
cp+=v[t];
Backtrack(t+1);
cw-=w[t];
cp-=v[t];
}
if(Bound(t+1)>bestp)
{
x[t]=0;
Backtrack(t+1);
}
}
void Knapsack(double W,int n)
{
cw=0;
cp=0;
bestp=0;
double sumw=0;
double sumv=0;
for (int i=1;i<=n;i++)
{
sumw+=w[i];
sumv+=v[i];
}
if(sumw<=W)
{
bestp=sumv;
cout << "放进背包的物品最大价值是:" << bestp << endl;
return;
}
Backtrack(1);
cout << "放入背包的物品最大价值是:" << bestp << endl;
cout << "放进背包的物品的序号是:";
for (int i=1;i<=n;i++)
{
if(bestx[i]==1)
{
cout << i << " " ;
}
}
cout << endl;
}
int main()
{
cout << "请输入物品的个数:" << endl;
cin >>n;
cout << "请输入背包的重量W:" << endl;
cin>>W;
cout << "请依次输入每个物品的重量w和价值v,用空格分开";
for (int i=1;i<=n;i++)
{
cin >> w[i] >> v[i];
}
Knapsack(W,n);
return 0;
}