zoukankan      html  css  js  c++  java
  • 01背包问题

    二位数组实现01背包算法:

    #include<stdio.h>
    int main()
    {
        int max(int x,int y);
        int v,n,a[105],b[105],c[105][105],i,j;
        scanf("%d %d",&v,&n);
        for(i=1;i<=n;i++)
            scanf("%d %d",&a[i],&b[i]);
        for(i=1;i<=n;i++)
            for(j=1;j<=v;j++)
            {
            if(a[i]>j)
            c[i][j]=c[i-1][j];
            else
            c[i][j]=max(c[i-1][j],(c[i-1][j-a[i]]+b[i]));
            }
            printf("%d
    ",c[n][v]);
    }
    int max(int x,int y)
    {
        if(x>=y)
        return x;
        else
            return y;
    }

    一维数组实现01背包算法:

    #include<iostream>
    #include<cstring>
    using namespace std;
    int cheak[2000][2000];
    int main()
    {
        int m,n,v[1005],val[1005],dp[2000];
        while(cin>>m>>n)
        {
            memset(dp,0,sizeof(dp));
            memset(cheak,0,sizeof(cheak));
            for(int i=1;i<=n;++i)
                cin>>v[i]>>val[i];
            for(int i=n;i>=1;--i)
                for(int j=m;j>=v[i];--j)
            {
                if(dp[j]<(dp[j-v[i]]+val[i]))
                {
                    dp[j]=dp[j-v[i]]+val[i];
                    cheak[i][j]=1;
                }
            }
            cout<<dp[m]<<endl;
         }
    }

    01背包取的物品是那些,取物品路径,价值,容量:

    #include<iostream>
    #include<cstring>
    using namespace std;
    int cheak[2000][2000];
    int main()
    {
        int m,n,v[1005],val[1005],dp[2000];
        while(cin>>m>>n)
        {
            memset(dp,0,sizeof(dp));
            memset(cheak,0,sizeof(cheak));
            for(int i=1;i<=n;++i)
                cin>>v[i]>>val[i];
            for(int i=n;i>=1;--i)
                for(int j=m;j>=v[i];--j)
            {
                if(dp[j]<(dp[j-v[i]]+val[i]))
                {
                    dp[j]=dp[j-v[i]]+val[i];
                    cheak[i][j]=1;
                }
            }
            cout<<dp[m]<<endl;
            int i=1,j=m;
            while(i<=n&&j>0)
            {
                if(cheak[i][j])
                {
                    cout<<i<<" ";
                    j=j-v[i];
                }
                i++;
            }
        }
    }
  • 相关阅读:
    android Edittext自定义输入字符和类型
    让android webView使用系统默认浏览器内核直接解析,不弹出选择浏览器选项
    java对象中继承和变量初始化顺序浅析
    android判断pad还是手机
    我不知道自己想要什么
    计算机网络概述
    2020/2/27-28
    操作系统概述
    数据模型
    数据库系统概述
  • 原文地址:https://www.cnblogs.com/Leozi/p/10834966.html
Copyright © 2011-2022 走看看