zoukankan      html  css  js  c++  java
  • 0-1背包

    0-1背包

    1.题目

    2.过程

      (1)假如我们放进背包,f[i][j] = f[i - 1][j - weight[i]] + value[i],这里的f[i - 1][j - weight[i]] + value[i]应该这么理解:在没放这件物品之前的状态值加上要放进去这件物品的价值。而对于f[i - 1][j - weight[i]]这部分,i - 1很容易理解,关键是 j - weight[i]这里,我们要明白:要把这件物品放进背包,就得在背包里面预留这一部分空间。

      (2)假如我们不放进背包,f[i][j] = f[i - 1][j],这个很容易理解。

        因此,我们的状态转移方程就是:f[i][j] = max(f[i][j] = f[i - 1][j] , f[i - 1][j - weight[i]] + value[i])  

        当然,还有一种特殊的情况,就是背包放不下当前这一件物品,这种情况下f[i][j] = f[i - 1][j]。

    代码:

    #include <iostream>
    #include<bits/stdc++.h>
    
    using namespace std;
    
    int w[105], val[105];
    int dp[105][1005];
     
    int main()
    {
        int C, m;
        cin >> C >> m;
        for(int i=1; i<=m; i++)
            cin >> w[i] >> val[i];
        
        for(int i=1; i<=m; i++) //物品 
            for(int j=C; j>=0; j--) //容量 
            {
                if(j >= w[i])
                    dp[i][j] = max(dp[i-1][j-w[i]]+val[i], dp[i-1][j]);
                else      //只是为了好理解
                    dp[i][j] = dp[i-1][j];           
            }
        cout << dp[m][C] << endl;
        return 0;
    }

     

    代码:

    #include <iostream>
    #include<bits/stdc++.h>
    using namespace std;
    
    int f[100],v[100],w[100];
    int main(){
        int C,N;
        cin>>C>>N;
        for (int i = 1; i <= N; i++)
            cin>>w[i]>>v[i];
        for (int i = 1; i <= N; i++)
            for (int j = C; j >= w[i] ; j--)
                f[j]=max(f[j-w[i]]+v[i],f[j]);
        cout<<f[C]<<endl;
    }

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13724279.html

  • 相关阅读:
    面试金典——模式匹配
    浅谈C语言中的联合体
    android recovery模式及ROM制作
    模拟键盘输入 : SendMessage, keybd_event, PostKeybdMessage
    在游戏中使用keybd_event的问题
    keybd_event函数用法
    C语言清空输入缓冲区的N种方法对比
    深究“字节对齐”的原因
    字节对齐
    网络安装CentOS 5.3
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13724279.html
Copyright © 2011-2022 走看看