题目描述
桐桐有N件货物需要运送到目的地,它们的质量和价值分别记为:
质量:W1,W2,…,Wn;
价值:Vl,V2,…,Vn;
已知某辆货车的最大载货量为x,并且当天只能运送一趟货物。这辆货车应该运送哪些货物,才能在不超载的前提下使运送的价值最大?
输入
第1行是一个实数,表示货车的最大载货量x(1<x≤I00)。
第2行是一个正整数,表示待运送的货物数n(1<n≤20)。
后面n行每行两个用空格隔开的实数,分别表示第1至第n件货物的质量w和价值V。
输出
第1行为被运送货物的总价值(只输出整数部分);
第2行为按编号大小顺序输出所有被运送货物的编号(当一件都不能运送时,不输)。
样例输入 Copy
20
4
3.5 4
4 5
5 6.8
6.9 7
样例输出 Copy
22
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
vector<int> ans,tmp;
double w[N],v[N],W,n,maxn;
void dfs(double val,int i,double weight)
{
if(i>n) //边界
{
if(val>maxn)
{
maxn=val;
ans=tmp;
}
return ;
}
if(weight+w[i]<=W)
{
tmp.push_back(i);
dfs(val+v[i],i+1,weight+w[i]); //符合条件的
tmp.pop_back();
}
dfs(val,i+1,weight); //不符合条件的遍历到下一个
}
int main()
{
cin>>W>>n;
for(int i=1;i<=n;i++) cin>>w[i]>>v[i];
dfs(0,1,0);
cout<<(long long)maxn<<endl;
for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
cout<<endl;
}