HDU 3448 Bag Problem 暴力枚举,DFS(maybe)

来源:互联网 发布:陈奕迅专辑 知乎 编辑:程序博客网 时间:2024/05/17 11:56

来找博客的估计应该都看过题,所以以后的博客在这里都不贴题了,直接放一个传送门,想看题的点击去看这里是传送门


这道题是我们背包的一道训练题,这道题我用了两种解法来解


第一种解法是我刚开始想的暴力枚举,代码很易懂,先把0存起来,然后把第一个数和存过的数每个相加,都存起来,然后在把第二个数和之前的数依次相加,不过这样的话要存的数可能有2^40这么多,很显然存不下,所以我们可以用一些方法,来排除掉一些数,具体可以看一下代码,这里用了一下map,因为开不了1e9的数组,会超内存,然而这么做也是不对的...很轻易的来一组数据就可以爆掉,因为毕竟数组开不到那么大,即使开到了也会超时,附爆掉数据

30 821483646 40
1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 99 999 524 315516321 132132 789412 2305404 12215 3232 54906


下面是第二种解法,这种解法利用的DFS的思想,准确的说不是我自己想出来,这道题我提交之后,第一种方法用时31ms,然而我看和我一起做题的同学们AC时间都是0ms啊!我就很不爽,然而没想出来什么,就去网上偷偷找了博客(羞耻脸...),发现了一种DFS的解法,然而我按DFS的解法算了一遍提交之后,竟然超时!?和网上的AC代码进行的对比,差在哪里呢?差在一步,就是求出来最大的m个物品的价值会不会超过给定的价值,如果不超过,就不用算了,然而我认为这种减枝一点也不可靠,于是随便拿了一组样例就把这个代码给爆了,唔,网上找到的主流代码都没过去...样例如下...秉着学习的原则...博主还是希望能被打脸的...

30 764 40
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

这里两个代码都给出...然而两个AC代码都被我自己爆掉了...如果有真正能AC的代码的大神请联系我...


#include <bits/stdc++.h>using namespace std;//做法一 暴力解法 31msint main(){    int m,n,p,temp,cur,cur1,ans;    int wc[100000];    map<int,int> ok;    while(cin>>m>>n>>p)    {        ok.clear();        cur=1;        ans=0;        wc[0]=0;        ok[0]=0;        for(int i=1;i<=p;i++)        {            cin>>temp;            cur1=cur;            sort(wc,wc+cur1,greater<int>());            for(int j=0;j<cur1;j++)            {                if((ok[wc[j]]+1<ok[temp+wc[j]]||!ok[temp+wc[j]])&&ok[wc[j]]<m&&temp+wc[j]<=n)                {                    ok[temp+wc[j]]=ok[wc[j]]+1;                    wc[cur++]=temp+wc[j];                    if(temp+wc[j]>ans)                        ans=temp+wc[j];                }            }        }        cout<<ans<<endl;    }    return 0;}//做法二 DFS解法 0ms/*int a[45],m,n,p,ans;void dfs(int t,int num,int sum){    ans=max(ans,sum);    if(t>p)        return;    if(sum+a[t]<=n&&num+1<=m)        dfs(t+1,num+1,sum+a[t]);    dfs(t+1,num,sum);    return;}int main(){    while(cin>>m>>n>>p)    {        ans=0;        for(int i=1;i<=p;i++)            cin>>a[i];        sort(a+1,a+p+1,greater<int>());        for(int i=1;i<=m;i++)            ans+=a[i];        if(ans<=n)            cout<<ans<<endl;        else        {            ans=0;            dfs(1,0,0);            cout<<ans<<endl;        }    }    return 0;}*/


0 0
原创粉丝点击