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

    状态表示:\(f(i,j)\)表示从前\(i\)个物品中选,总体积不超过\(j\)的情况下的最大价值。

    和01背包一样,完全背包问题的每种物品都有两种策略,但是也有不同点。

    对第i件物品来说:

    1. 不放第i件物品,那么f[i][v]= f[i- 1][v], 这步跟01背包是一样的。
    2. 放第i件物品。这里的处理和01背包有所不同,因为01背包的每个物品只能选择一个,因此选择放第i件物品就意味着必须转移到f[i-1][v-w[i]]这个状态;但是完全背包不同,完全背包如果选择放第i件物品之后并不是转移到f[i-1][v-w[i]],而是转移到f[i][v-w[i]],这是因为每种物品可以放任意件(注意有容量的限制,因此还是有限的),放了第i件物品后还可以继续放第i件物品,直到第二维的v-w[i]无法保持大于等于0为止。

    状态转移:

    \(f[i][j]=max(f[i,j-v]+w , f[i-1][j])\)

    const int N=1010;
    int f[N][N];
    int n,m;
    
    int main()
    {
        cin>>n>>m;
    
        for(int i=1;i<=n;i++)
        {
            int v,w;
            cin>>v>>w;
            for(int j=0;j<=m;j++)
                if(j<v) f[i][j]=f[i-1][j];
                else f[i][j]=max(f[i-1][j],f[i][j-v]+w);
        }
    
        cout<<f[n][m]<<endl;
        //system("pause");
    }
    

    优化至一维

    const int N=1010;
    int f[N];
    int n,m;
    
    int main()
    {
        cin>>n>>m;
    
        for(int i=1;i<=n;i++)
        {
            int v,w;
            cin>>v>>w;
            for(int j=v;j<=m;j++)
                f[j]=max(f[j],f[j-v]+w);
        }
    
        cout<<f[m]<<endl;
        //system("pause");
    }
    
  • 相关阅读:
    WPF 策略模式
    老陈 WPF
    老陈 ASP.NET封装
    小石头 封装
    典型用户故事
    整数的四则运算
    对git的认识
    如何学习计算机
    团队编程二——web应用之人事管理系统
    团队编程——web应用之人事管理系统
  • 原文地址:https://www.cnblogs.com/fxh0707/p/13697013.html
Copyright © 2011-2022 走看看