#include<iostream>
#include<vector>
using namespace std;
vector<pair<int, pair<int, int> > >temp;
vector<vector<pair<int, pair<int, int> > > >result; //结果集
void dfs(vector<pair<int, pair<int, int> > >& candidates, int target, int &sum, int start)
{
int size = candidates.size();
for (int i = start; i < size; i++)
{
if (sum + candidates[i].second.first <= target) //凡是容量和小于V的都可加入
{
temp.push_back(candidates[i]);
result.push_back(temp);
sum += candidates[i].second.first;
dfs(candidates, target, sum, i + 1);
temp.pop_back(); //一定要pop_back,否则无法正确遍历
sum -= candidates[i].second.first;
}
}
}
vector<vector<pair<int, pair<int, int> > > >MaxMagic(vector<pair<int, pair<int, int> > >&candidates, int target)
{
int size = candidates.size();
if (size == 0)
return result;
int vtep = 0;//当前的容量
int start = 0;
temp.clear();
result.clear();
dfs(candidates, target, vtep, start); //深度遍历
return result;
}
int main(){
int num;//糖果数量
int v;//车子容量
vector<pair<int, pair<int, int> > >candidates;
vector<vector<pair<int, pair<int, int> > > >re;
int v_min, v_now;
vector<int>mark;
int count = 0;
while (cin >> num>>v)
{
//每一个测试数据的开始
count = 0;
candidates.clear();
re.clear();
mark.clear();
int type, magicnum; //糖果型号 魔幻因子数量
for (int i = 0; i < num; i++)
{
cin >> type;
cin >> magicnum;
candidates.push_back(make_pair(++count, make_pair(type, magicnum)));
}
re = MaxMagic(candidates, v);
v_min = 0;
int re_size=re.size();
if(re_size==0) //结果集为空
{
cout<<0<<endl;
cout<<"No"<<endl;
continue;
}
for(int i = 0; i<re_size; i++) //寻找魔幻因子最大的糖果序列
{
v_now = 0;
int temp=re[i].size();
for (int j = 0; j < temp; j++)
v_now += re[i][j].second.second;
if (v_min <= v_now)
{
if (v_min < v_now)
{
v_min = v_now;
mark.clear();
mark.push_back(i);
}
else
{
mark.push_back(i);
}
}
}
cout << v_min << endl;
int result_size=re[mark[0]].size(); //结果集中第一个结果序列一定是编号最小的组
for (int j = 0; j < result_size; j++)
cout << re[mark[0]][j].first << " ";
cout << endl;
}
return 0;
}
(买糖果)京东研发笔试
最新推荐文章于 2024-06-18 21:01:00 发布