ZOJ 3631 Watashi's BG

  这道题思路不难,用01背包的思想来解这道题,一个M的背包装N个物品,这N个物品的权值和

体积都是vi,很简单的一个模型,直接用背包的方法解的话,不止会超内存,而且会超时,这

样WA了一遍之后寻求另一种写法。然后就用深搜加剪枝过了这道题。排序后从大的取起。

/*Accepted    180 KB    0 ms    C++ (g++ 4.4.5)    795 B    2012-09-11 16:03:06*/

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <algorithm>

using namespace std;



const int MAXN = 35;

int v[MAXN];

int N, M;

int ans;



void dfs(int i, int val)

{

    if(ans == M) return;

    if(val > M) return;

    if(i < 1)

    {

        ans = max(ans, val);

        return;

    }

    int j, sum = val;

    for(j = i; j >= 1; j --)

        sum += v[j];

    if(sum < ans) return;

    dfs(i - 1, val + v[i]);

    dfs(i - 1, val);

}



void Read()

{

    int i;

    for(i = 1; i <= N; i ++)

        scanf("%d", &v[i]);

    sort(v + 1, v + 1 + N);

}



int main()

{

    while(scanf("%d%d", &N, &M) != EOF)

    {

        Read();

        ans = 0;

        dfs(N, 0);

        printf("%d\n", ans);

    }

    return 0;

}

 

 

 

你可能感兴趣的:(ZOJ)