POJ 3628 Bookshelf 2 0-1背包 or DFS 水题

我竟然做了一题水题,浪费我感情啊,5分钟内2个AC(还是1A);

1.0-1背包

View Code
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int w[22];
bool dp[20000000];
int main()
{
    int n, m, i, j, b;
    while(~scanf("%d%d",&n,&b))
    {
        m=0;
        for(i=1;i<=n;i++)
            scanf("%d",&w[i]),m+=w[i];
        for(i=1;i<=m;i++)
            dp[i]=0;
        dp[0]=1;
        for(i=1;i<=n;i++)
        {
            for(j=m;j>=w[i];j--)
                if(dp[j-w[i]])dp[j]=1;
        }
        for(i=b;i<=m;i++)
            if(dp[i]){printf("%d\n",i-b);break;}
    }
    return 0;
}

2.DFS

View Code
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[22], minn,n, b, s;
void dfs(int pos, int sum)
{
    if(sum>=b)minn=min(minn,sum);
    int i;
    for(i=pos;i<n;i++)
    {
        dfs(i+1,sum+a[i]);
    }
}
int main()
{
    int i, j;
    while(~scanf("%d%d",&n,&b))
    {
        s=0;
        for(i=0;i<n;i++)
            scanf("%d",&a[i]),s+=a[i];
        minn=s;
        dfs(0,0);
        printf("%d\n",minn-b);
    }
    return 0;
}

 

posted @ 2012-08-10 20:05  To be an ACMan  Views(268)  Comments(0)    收藏  举报