深搜5:【SSL】1326.货物装箱
题目:
桐桐有N件货物需要运送到目的地,它们的质量和价值分别记为:
质量:W1,W2,…,Wn;
价值:V1,V2,…,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
思路:
这题和以前做过的一道递归装箱问题很像,只不过这道题的数据是实数,而且最后还要输出价值最大的装箱方法,其他就没什么太大区别。
顺便介绍一个内置函数memcpy:把一个数组里的值拷到另一个数组里。例如:memcpy(a,b,sizeof(b))就是把b数组里的所有数字拷到a数组里。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
double s,lz,x;
struct hw
{
double zl,jz;
}a[30];
bool b[30],c[30];
void dfs(int x,double sy,double zj)
{
if(x>n)
{
if(zj>lz)
{
lz=zj;
memcpy(c,b,sizeof(b));
}
return ;
}
dfs(x+1,sy,zj);
if(sy>=a[x].zl)
{
b[x]=true;
dfs(x+1,sy-a[x].zl,zj+a[x].jz);
b[x]=false;
}
}
int main()
{
cin>>s>>n;
for(int i=1;i<=n;i++)
cin>>a[i].zl>>a[i].jz;
dfs(1,s,0);
cout<<int(lz)<<endl;
for(int i=1;i<=n;i++)
if(c[i])
cout<<i<<" ";
return 0;
}