三种背包一点通

题目描述

普通背包,完全背包,多重背包

不讲了,直接上代码!

⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇

普通背包

#include<bits/stdc++.h>
using namespace std;
int main()
{
	 int n,m;
        cin>>n>>m;
        int w[m],v[m],dp[n+1];
        for(int i=0;i<m;i++)
        {
            cin>>w[i]>>v[i];
        }
        memset(dp, 0, sizeof(dp));
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<=n;j++)
            {
                if(j-w[i]>=0)
                {
                    dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
                }
            }
        }
        cout<<dp[n];
}

完全背包

#include<bits/stdc++.h>
using namespace std;
int main()
{
	 int n,m;
        cin>>n>>m;
        int v[m],w[m],dp[n+1],y[m],sum=0,u=0;
        for(int i=0;i<m;i++)
        {
            cin>>w[i]>>v[i]>>y[i];
            sum+=y[i];
        }
        int b[sum][2];
        memset(dp,0,sizeof(dp));
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<y[i];j++)
            {
                b[u][0]=w[i];
                b[u][1]=v[i];
                u++;
            }
        }
        for(int i=0;i<sum;i++)
        {
            for(int j=n;j>=0;j--)
            {
                if(j-b[i][0]>=0)
                {
                    //dp[10]=max(0,
                    dp[j]=max(dp[j],dp[j-b[i][0]]+b[i][1]);
                }
            }
        }
        for(int i=0;i<=sum;i++)
        {
            cout<<b[i][0]<<' '<<b[i][1]<<endl;
        }
}

多重背包

#include<bits/stdc++.h>
using namespace std;
    const int maxn = 5e3+233;
    const double eps = 1e-8;
    typedef long long LL;
    int T,n,m,sum,ans;
    LL a[maxn];
    LL Lmax[maxn],Rmin[maxn];
    LL Lsum[maxn],Rsum[maxn];
    LL minCostIncThenDec(int n)
    {
        Lmax[0] = a[0];
        Lsum[0] = 0;
        //1 4 3 2 5
        //Lmax[0]=1
        //Lsum[0]=0
        for(int i=1; i<n; ++i)
        {

            Lmax[i] = max(Lmax[i-1]+1, a[i]);
            Lsum[i] = Lsum[i-1] + Lmax[i] - a[i];
        }

        Rmin[n-1] = a[n-1];
        Rsum[n-1] = 0;

        for(int i=n-2; i>=0; --i)
        {
            Rmin[i] = max(Rmin[i+1]+1, a[i]);
            Rsum[i] = Rsum[i+1] + Rmin[i] - a[i];
        }
        LL ans = (1LL)*INT_MAX;
        LL tmp;

//          1 4 3 2 5
//        Lmax[0]=1 Lmax[1]=4 Lmax[2]=5 Lmax[3]=6 Lmax[4]=7
//        Lsum[0]=0 Lsum[1]=0 Lsum[2]=2 Lsum[3]=6 Lsum[4]=8
//
//        Rmin[4]=5 Rmin[3]=6 Rmin[2]=7 Rmin[1]=8 Rmin[0]=9
//        Rsum[4]=0 Rsum[3]=4 Rsum[2]=8 Rsum[1]=12 Rsum[0]=20

        for (int i=0; i<n; ++i)
        {
            if (Lmax[i] > Rmin[i])
            {
                //3+5=8
                tmp = Lsum[i] + Rsum[i] - Rmin[i] + a[i];
            }
            else
            {
                //20-1+1=20
                //8+4=12
                //5+3=8
                //4+2=6
                tmp = Lsum[i] + Rsum[i] - Lmax[i] + a[i];
            }
            ans = min(ans, tmp);
        }
        return ans;
    }
    void input()
    {
        //freopen("in.txt","r",stdin);
        cin>>n;
        for(int i=0; i<n; ++i)
        {
            cin>>a[i];
        }
    }
    void solve()
    {
        cout<<minCostIncThenDec(n)<<endl;
    }
int main()
{
    input();
   	solve();
}

谢谢观看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值