hdu3448(dfs解二维背包)

来源:互联网 发布:超级大傻瓜软件 编辑:程序博客网 时间:2024/04/30 00:50

链接:点击打开链接

题意:有k个物品,背包容量是m,问最多装n个物品最大的重量(k<=40,n<=40,剩余所有变量的范围是1~1000000000)

代码:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;int n,k,w,ans,a[50];void dfs(int t,int num,int sum){    ans=max(ans,sum);    if(num==k+1)    return;    if(sum+a[num]<=w&&t+1<=n)    dfs(t+1,num+1,sum+a[num]);    dfs(t,num+1,sum);}                                               //因为无法开三维数组int main(){                                     //并且物品个数很少,因此用搜索    int i,sum;    while(scanf("%d%d",&n,&w)!=EOF){        sum=0;        scanf("%d",&k);        for(i=1;i<=k;i++)        scanf("%d",&a[i]);        sort(a+1,a+k+1,greater<int>());         //不加会超时        for(i=1;i<=n;i++)        sum+=a[i];        if(sum<=w){            printf("%d\n",sum);            continue;        }        ans=0;        dfs(0,1,0);        printf("%d\n",ans);    }    return 0;}

0 0
原创粉丝点击