题目分析:总的费用m一定,给出n天,给出n天 每一天的花费,让你求出能凑出的最大的报销额 ,不能超过m,用01背包铁定超时,m<=10^7,所以用搜索.....
先排序,排序后,再搜索,不然会超时.....
参考的大牛的代码:http://blog.sina.com.cn/s/blog_6fc8480501018m2t.html
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int w[40];
int n,m,ans;
int cmp(int x,int y)
{
return x<y;
}
void dfs(int k,int sum)
{
if(ans==m)
return;
if(ans<sum)
ans=sum;
for(int i=k;i<n&&sum+w[i]<=m;i++)
dfs(i+1,sum+w[i]);
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
int sum=0;
for(int i=0;i<n;i++)
{
scanf("%d",&w[i]);
sum+=w[i];
}
if(sum<=m)
{
printf("%d\n",sum);
}
else
{
sort(w,w+n,cmp);
ans=0;
dfs(0,0);
printf("%d\n",ans);
}
}
//system("pause");
return 0;
}