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

    这里写图片描述

    #include <cstdio>
    #include <iostream>
    
    using namespace std;
    
    #define MAX_N 100
    #define MAX_W 1000
    
    int n,W;
    
    // 从第i个物品开始挑选总重量小于j的部分
    int rec(int i,int j)
    {
        int res;
        if(i==n)
            res=0;  // 已经没有剩余物品了
        else if(j<w[i])
            res=rec(i+1,j);    // 无法挑选该物品
        else
            res=max(rec(i+1,j),rec(i+1,j-w[i])+v[i]);  // 挑选与不挑选的情况中选择最大的一种
        return res;
    }
    
    void solve()
    {
        printf("%d
    ",rec(0,W));
    }
    
    int main()
    {
        printf("n W:
    ");
        scanf("%d %d",&n,&W);
    
        for(int i=0;i<n;i++)
        {
            printf("w[%d] v[%d]:
    ",i,i);
            scanf("%d %d",&w[i],&v[i]);
        }
    
        solve();
        return 0;
    }

    优化——记忆化搜索

    #include <cstdio>
    #include <iostream>
    #include <memory.h>
    
    using namespace std;
    
    #define MAX_N 100
    #define MAX_W 1000
    
    int n,W;
    int w[MAX_N],v[MAX_N];
    
    int dp[MAX_N+1][MAX_W+1];
    
    int rec(int i,int j)
    {
        if(dp[i][j]>=0)
            return dp[i][j];
        int res;
        if(i==n)
            res=0;
        else if(j<w[i])
            res=rec(i+1,j);
        else
            res=max(rec(i+1,j),rec(i+1,j-w[i])+v[i]);
        return dp[i][j]=res;
    }
    
    void solve()
    {
        memset(dp,-1,sizeof(dp));
        printf("%d
    ",rec(0,W));
    }
    
    int main()
    {
        printf("n W:
    ");
        scanf("%d %d",&n,&W);
    
        for(int i=0;i<n;i++)
        {
            printf("w[%d] v[%d]:
    ",i,i);
            scanf("%d %d",&w[i],&v[i]);
        }
    
        solve();
        return 0;
    }
    

    二重循环

    #include <cstdio>
    #include <iostream>
    
    using namespace std;
    
    #define MAX_N 100
    #define MAX_W 1000
    
    int n,W;
    int w[MAX_N],v[MAX_N];
    
    int dp[MAX_N+1][MAX_W+1];
    
    void solve()
    {
        for(int i=n-1;i>=0;i--)
        {
            for(int j=0;j<=W;j++)
            {
                if(j<w[i])
                    dp[i][j]=dp[i+1][j];
                else
                    dp[i][j]=max(dp[i+1][j],dp[i+1][j-w[i]]+v[i]);
            }
        }
        printf("%d
    ",dp[0][W]);
    }
    
    int main()
    {
        printf("n W:
    ");
        scanf("%d %d",&n,&W);
    
        for(int i=0;i<n;i++)
        {
            printf("w[%d] v[%d]:
    ",i,i);
            scanf("%d %d",&w[i],&v[i]);
        }
    
        solve();
        return 0;
    }

    i的循环为正向进行情况:

    void solve()
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<=W;j++)
            {
                if(j<w[i])
                {
                    dp[i+1][j]=dp[i][j];
                }
                else
                {
                    dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]);
                }
            }
        }
        printf("%d
    ",dp[n][W]);
    }
    
  • 相关阅读:
    第四周:卷积神经网络 part3
    第四周作业:卷积神经网络学习part3
    视频学习--《 图像语义分割前沿进展》
    视频学习--《语义分割中的自注意力机制和低秩重建》
    第二次作业:卷积神经网络 part 1
    使用VGG模型迁移学习进行猫狗大战
    使用 VGG16 对 CIFAR10 分类
    CIFAR10 数据集分类
    MNIST数据集分类
    第一次作业:深度学习基础
  • 原文地址:https://www.cnblogs.com/NoMasp/p/4540443.html
Copyright © 2011-2022 走看看