题目描述
桐桐有N件货物需要运送到目的地,它们的质量和价值分别记为:
质量:W1,W2,…,Wn;
价值:V1,V2,\ldtos,Vn;
已知某辆货车的最大载货量为x
,并且当天只能运送一趟货物。这辆货车应该运送哪些货物,才能在不超载的前提下使运送的价值最大?
输入描述
第1行是一个实数,表示货车的最大载货量x(1<x≤100)。
第2行是一个正整数,表示待运送的货物数n(1<n≤20)。
后面n行每行两个用空格隔开的实数,分别表示第1至第n件货物的质量w和价值V。
输出描述
第1行为被运送货物的总价值(只输出整数部分);
第2行为按编号大小顺序输出所有被运送货物的编号(当一件都不能运送时,不输)。
样例
输入
20
4
3.5 4
4 5
5 6.8
6.9 7
输出
22
1 2 3 4
代码如下:
#include<bits/stdc++.h>
using namespace std;
double x,w[100],v[100]; //存放数据
int n,id,ido; //用二进制来表示物品选取的状态
double maxv=0;
void dfs(int t,int id,double vv,double ww)
{
if(ww>x || t==n+2) //返回条件
return;
if(vv>maxv) //数据更新
{
maxv=vv;
ido=id;
}
/*
if(vv>maxv) //这种写法是不对的
{ //因为有质量限制的原因,
maxv=vv; //所以dfs应当先写出返回条件
ido=id;
}
if(ww>x || t==n+1)
return;
*/
dfs(t+1,id+(1<<(t-1)),vv+v[t],ww+w[t]); //取第t个物品
dfs(t+1,id,vv,ww); //不取第t个物品
}
int main()
{
cin>>x>>n;
for(int i=1; i<=n; i++)
{
cin>>w[i]>>v[i];
}
dfs(1,0,0,0);
cout<<(int)maxv<<endl; //强制输出
for(int i=1; i<=n; i++)
{
if((1<<(i-1))&ido)
cout<<i<<" ";
}
return 0;
}