poj3624 简单的01背包问题

问题描述:

  总共有N种宝石供挑选,宝石i的重量为Wi,吸引力为Di,只可以用一次。Bessie最多可负担的宝石手镯总重量为M。给出N,M,Wi,Di,求M。

非常标准的01背包问题。使用了优化的一维数组的代码。因为对于这类问题,只有i-1的f[v]对计算i的f[v]有用,所以使用一维数组的时候相当于将原来i-1之前的记录覆盖掉。

下边是我的代码:

#include<iostream>

#include<string.h>

#include<stdio.h>

#define M 12880+10

using namespace std;

int f[M];

int w[3500],d[3500];

int main(){

    int n,m;

    scanf("%d%d",&n,&m);

    memset(f,0,sizeof(f));

    for(int i=0;i<n;i++){

        scanf("%d%d",w+i,d+i);

    }

    for(int i=0;i<n;i++){

        for(int j=m;j>=w[i];j--){

            if(f[j]<f[j-w[i]]+d[i]){

                f[j]=f[j-w[i]]+d[i];

            }

        }

    }

    printf("%d\n",f[m]);

    return 0;

}

算法的时间复杂度为O(MN),空间复杂度为O(M);

你可能感兴趣的:(poj)