zoukankan      html  css  js  c++  java
  • HDU4508 湫湫系列故事——减肥记I

       这题一开始看还以为是0,1背包问题,不过老师说过了完全背包就按照这个思路做.(虽然偷偷去百度了一下到底是不是,有点怀疑老师是不是记错了的说);

      顺便记下对一维数组方程的理解;

      for(int i =1;i<=n;i++)有n次就可以啦;//闭区间

      for(int j=b[i];j<=m;j++)//每进行一次循环,第i件物品数加1或者0;

      dp[j]=max(dp[j],dp[j-b[i]]+a[i]);//如果是最优解的话,先后顺序无所谓是不是;

      下面给出代码.嘻嘻.

    //这个在背包九讲里面也提到了,个人觉得蛮重要的;

    初始化的f数组事实上就是在没有任何物品可以放入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量为0的背包可能被价值为0的nothing“恰好装满”,其它容量的背包均没有合法的解,属于未定义的状态,它们的值就都应该是-∞了。如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不装”,这个解的价值为0,所以初始时状态的值也就全部为0了。

     

     1 #define maxn 100005
     2 #include<iostream>
     3 using namespace std;
     4 int a[maxn],b[maxn],n,m,dp[maxn];
     5 int max(int a,int b)
     6 {
     7     return a>b?a:b;
     8 }
     9 int main()
    10 {
    11     //freopen("4508.txt","r",stdin);
    12     while(~scanf("%d",&n))
    13     {
    14         memset(a,0,sizeof(a));
    15         memset(b,0,sizeof(b));
    16         memset(dp,0,sizeof(dp));
    17         int i,j;
    18         for(i=1;i<=n;i++)
    19             scanf("%d %d",a+i,b+i);
    20         scanf("%d",&m);
    21         for(i=1;i<=n;i++)
    22             for(j=b[i];j<=m;j++)
    23                 dp[j]=max(dp[j],dp[j-b[i]]+a[i]);
    24             printf("%d ",dp[m]);
    25     }
    26     return 0;
    27 }
  • 相关阅读:
    SPOJ 694 (后缀数组) Distinct Substrings
    POJ 2774 (后缀数组 最长公共字串) Long Long Message
    POJ 3693 (后缀数组) Maximum repetition substring
    POJ 3261 (后缀数组 二分) Milk Patterns
    UVa 1149 (贪心) Bin Packing
    UVa 12206 (字符串哈希) Stammering Aliens
    UVa 11210 (DFS) Chinese Mahjong
    UVa (BFS) The Monocycle
    UVa 11624 (BFS) Fire!
    HDU 3032 (Nim博弈变形) Nim or not Nim?
  • 原文地址:https://www.cnblogs.com/xiaoniuniu/p/3879405.html
Copyright © 2011-2022 走看看