首页 > 其他 > 详细

poj3624 简单的01背包问题

时间:2015-03-30 18:22:01      阅读:200      评论:0      收藏:0      [点我收藏+]

问题描述:

  总共有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);

poj3624 简单的01背包问题

原文:http://www.cnblogs.com/jxzheng/p/4378364.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!