HDU-2191 (多重背包)

本文探讨了多重背包问题的两种解决方案,一种是O(n^3)的时间复杂度算法,另一种是通过二进制优化达到O(nlog(n))的时间复杂度算法。文章详细介绍了这两种算法的实现过程,对于解决在有限预算内最大化购买物品总价值的问题提供了有效的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

两个整数n和m(1<=n<=100, 1<=m<=100),分别表示经费的金额和大米的种类,然后是m行数据,每行包含3个数p,h和c(1<=p<=20,1<=h<=200,1<=c<=20),分别表示每袋的价格、每袋的重量以及对应种类大米的袋数。问能够购买大米的最多重量。

分析:

多重背包问题。

把经费看成背包容量,在经费限制下使大米的重量尽可能大。

代码:

 1.O(n^3)

#include<bits/stdc++.h>
using namespace std;
//Life is Short!
const int N=105;
int w[N],f[N][N],s[N],v[N];
int main(){
    int T;
    cin>>T;
    while(T--){
        int m,n;
        cin>>m>>n;
        for(int i=1;i<=n;++i){
            cin>>v[i]>>w[i]>>s[i];
        }
        memset(f,0,sizeof f);
        for(int i=1;i<=n;++i){
            for(int j=0;j<=m;++j){
                for(int k=0;k<=s[i]&&k*v[i]<=j;++k){
                    f[i][j]=max(f[i][j],f[i-1][j-k*v[i]]+w[i]*k);
                }
            }
        }
        cout<<f[n][m]<<endl;
    }
    return 0;
}

2.二进制优化 O(nlog(n))

#include<bits/stdc++.h>
using namespace std;
const int N=505;//注意数组要开nlogs=100*log(20)=500
int v[N],f[N],w[N];
int main(){
    int T;
    cin>>T;
    while(T--){
        memset(f,0,sizeof f);
        int n,m,cnt=0;
        cin>>m>>n;
        for(int i=1;i<=n;++i){
            int a,b,s;
            cin>>a>>b>>s;
            int k=1;
            while(k<=s){
                ++cnt;
                v[cnt]=a*k;
                w[cnt]=b*k;
                s-=k;
                k<<=1;
            }
            if(s>0){
                ++cnt;
                v[cnt]=a*s;
                w[cnt]=b*s;
            }
        }
        n=cnt;
        for(int i=1;i<=n;++i){
            for(int j=m;j>=v[i];--j){
                f[j]=max(f[j],f[j-v[i]]+w[i]);
            }
        }
        cout<<f[m]<<endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值