zoukankan      html  css  js  c++  java
  • 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
    ",f[m]);
        return 0;
    }

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

  • 相关阅读:
    POJ
    POJ
    操作系统
    POJ
    POJ
    codeforces Educational Round 89
    codeforces Round 647(div. 2)
    codeforces Educational Round 88
    后缀自动机简单总结
    dsu on tree 简单总结
  • 原文地址:https://www.cnblogs.com/jxzheng/p/4378364.html
Copyright © 2011-2022 走看看