• POJ 3624 charm bracelet 01背包 不要求装满


    用f[i]记录当背包容量为i时,最大的重量。

    那么初始状态所有f[i]=0,一个物品一个物品考察,从容量大的背包开始到容量为1的背包结束,这时所有容量小的背包肯定都还没有放入该物品,这时原有的f[i]值如果小于f[i-pi]+pi,

    也就是未放这物品和放这物品后的容量值做比较,发现放这物品后总的容量值增大了,就放这物品。

    推荐看背包九讲,网上有下载,写得很好

    View Code
     1 #include <cstdio>
     2 int f[13000];//f[i]的值为背包容量为i时得到的最大价值
     3 int w[3500];
     4 int d[3500];
     5 int main()
     6 {
     7     int n,m;
     8     scanf("%d%d",&n,&m);//n为物品数量,m为背包能容纳的种量
     9     for(int i=0; i< n; i++)
    10         scanf("%d%d",&w[i],&d[i]);//w[i]为物品的重量,d[i]为价值
    11     for(int i= 0; i < n; i++)//依次去试放每种物品
    12     {
    13         for(int k = m ; k > 0; k--)//从容量大的背包开始试
    14         {
    15             if(w[i] > k) continue;  //物品重量大于背包容量,不能放
    16             int t=f[k-w[i]] + d[i];
    17             if(f[k] < t)//物品放进去后,比不放得到的价值更大,那么放进去该物品
    18                 f[k] = t;
    19         }
    20     }
    21     printf("%d\n",f[m]);
    22     return 0;
    23 }
  • 相关阅读:
    【题解】Candle
    【题解】购物
    【题解】论逼格
    浅谈前缀和
    浅谈 LCA
    浅谈Meet in the middle——MITM
    拓扑排序
    时间复杂度符号
    浅谈排序算法[动图]
    404 页面不存在
  • 原文地址:https://www.cnblogs.com/allh123/p/2981624.html
Copyright © 2020-2023  润新知