【POJ】2392 - Space Elevator (多重背包,贪心)

题目

先将多重背包转换成01背包,然后贪心排序求最大值。

AC代码:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define inf 1ll<<30
using namespace std;

int dp[41111],val[411],num[411],cost;
struct block{
    int cost,val;
}b[2111];
bool cmp(block a,block b){
    if(a.cost == b.cost)    return a.val > b.val;     //贪心排序,因为这个大于号WA了一发
    return a.cost < b.cost; 
}
int main(){
    memset(dp,0,sizeof(dp));
    int v = 0,n,p=1;
    cin>>n;
    for(int i=1;i<=n;++i){
        cin>>val[i]>>cost>>num[i]; 
        v = max(v,cost);
        for(int j=1;j<=num[i];j<<=1){
            b[p].cost = cost;
            b[p].val = j*val[i];
            num[i] -= j;
            p++;
        }
        if(num[i]){
            b[p].cost = cost;
            b[p].val = num[i]*val[i];
            p++;num[i]=0;
        }
    }
    sort(b+1,b+p,cmp);
    int mmax = 0;
    for(int i=1;i<p;++i){
        for(int j=b[i].cost;j>=b[i].val;--j){  //背包容量从cost开始才有效
            dp[j] = max(dp[j],dp[j-b[i].val]+b[i].val); 
            mmax = max(mmax,dp[j]);
        }
    }
    cout<<mmax<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41009682/article/details/81509057