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);

posted on 2015-03-30 16:12  jxzheng  阅读(404)  评论(0编辑  收藏  举报

导航