zoukankan      html  css  js  c++  java
  • 洛谷 P1049 装箱问题

      这个题用贪心做肯定不行的,因为贪心得到的只是局部最优解,而这个题需要的是全局最优解,所以就用到了动态规划。

      用动态规划一定要找到这个题的状态转移方程。每一个物体,都只会有两种情况:装入箱子 和 不装入箱子,所以,定义两个数组,第一个数组s[]用来存储当容量为某某时,能装的最大体积,第二个数组a[]用来存储每个物品的体积;

      所以,状态转移方程:s[j]=max(s[j],s[j-a[i]]+a[i]);

      也就是说容量为 j 时,选第 i 个物品和不选第 i 个物品的最大值。

     1 #include<iostream>
     2 using namespace std;
     3 long long v,n,a[35],s[20010],w;
     4 int main()
     5 {
     6     
     7     cin>>v>>n;
     8     for(int i=1;i<=n;++i)
     9     {
    10         cin>>a[i];
    11     }
    12     for(int i=1;i<=n;++i)
    13     {
    14         for(int j=v;j>=a[i];--j)
    15         {
    16             s[j]=max(s[j],s[j-a[i]]+a[i]);
    17         }
    18     }
    19     w=v-s[v];
    20     cout<<w;
    21     return 0;
    22 }

      两层循环,第二层循环的 j 一定要大于等于 a[i] 因为若小于 a[i] 的话,这件物品就取不了。

      最后,题目求的是箱子的剩余空间,所以要用总空间再减去所用的空间。

  • 相关阅读:
    设计模式---工厂模式和抽象工厂模式
    设计模式---简单工厂模式
    设计模式---设计模式的分类及六大原则
    分布式---Raft算法
    分布式---Paxos算法
    分布式---CAP和BASE理论
    分布式---分布式事务
    分布式---分布式锁
    css
    react生命周期
  • 原文地址:https://www.cnblogs.com/zkw666/p/12771861.html
Copyright © 2011-2022 走看看