• 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++;
            }
        }
    }
  • 相关阅读:
    记账本程序三
    记账本程序二
    记账本程序一
    <<人月神话>>笔记1
    库存管理系统
    Java实现数据库
    第九周作业
    四则运算总结
    java异常处理
    第十周学习进度报告
  • 原文地址:https://www.cnblogs.com/Leozi/p/10834966.html
Copyright © 2020-2023  润新知