• 完全背包问题


     完全背包问题

     

    输入样例

    4 5
    1 2
    2 4
    3 4
    4 5
    

    输出样例:

    10



    二维暴力写法:


     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<map>
     7 #include<set>
     8 #include<vector>
     9 #include<sstream>
    10 using namespace std;
    11 #define ll long long
    12 const int inf=99999999;
    13 const int mod=1e9+7;
    14 
    15 const int maxn=1000+10;
    16 
    17 int value[maxn];//价值 
    18 int capacity[maxn];//体积 
    19 
    20 int dp[1010][maxn];//完全背包 
    21 
    22 int main()
    23 {
    24     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    25    
    26     int n,v;//n件物品,最大容量v 
    27     cin>>n>>v;
    28     
    29     for(int i=0;i<n;i++)
    30         cin>>capacity[i]>>value[i];
    31     
    32     memset(dp,0,sizeof(dp));
    33     
    34     for(int i=0;i<n;i++)
    35     {
    36         for(int j=0;j<=v;j++)
    37         {
    38             for(int k=0;k*capacity[i]<=j;k++)
    39             {
    40                 dp[i+1][j]=max(dp[i+1][j],dp[i][j-k*capacity[i]]+k*value[i]);
    41             }
    42         }
    43     }
    44     
    45     cout<<dp[n][v]<<endl;
    46     
    47     return 0;
    48 }
    
    
    
    
    二维优化写法:


     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<map>
     7 #include<set>
     8 #include<vector>
     9 #include<sstream>
    10 using namespace std;
    11 #define ll long long
    12 const int inf=99999999;
    13 const int mod=1e9+7;
    14 
    15 const int maxn=1000+10;
    16 
    17 int value[maxn];//价值 
    18 int capacity[maxn];//体积 
    19 
    20 int dp[1010][maxn];//完全背包 优化 
    21 
    22 int main()
    23 {
    24     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    25    
    26     int n,v;//n件物品,最大容量v 
    27     cin>>n>>v;
    28     
    29     for(int i=0;i<n;i++)
    30         cin>>capacity[i]>>value[i];
    31     
    32     memset(dp,0,sizeof(dp));
    33     
    34     for(int i=0;i<n;i++)
    35     {
    36         for(int j=0;j<=v;j++)
    37         {
    38             if(j<capacity[i])
    39                 dp[i+1][j]=dp[i][j];
    40             else
    41             {
    42                 if(dp[i][j]>dp[i+1][j-capacity[i]]+value[i])
    43                     dp[i+1][j]=dp[i][j];
    44                 else
    45                     dp[i+1][j]=dp[i+1][j-capacity[i]]+value[i];
    46             }
    47         }
    48     }
    49     
    50     cout<<dp[n][v]<<endl;
    51     
    52     return 0;
    53 }

    一维优化写法:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<map>
     7 #include<set>
     8 #include<vector>
     9 #include<sstream>
    10 using namespace std;
    11 #define ll long long
    12 const int inf=99999999;
    13 const int mod=1e9+7;
    14 
    15 const int maxn=1000+10;
    16 
    17 int value[maxn];//价值 
    18 int capacity[maxn];//体积 
    19 
    20 int dp[maxn];//完全背包 一维优化 
    21 
    22 int main()
    23 {
    24     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    25        
    26        int n,v;//n件物品,最大容量v 
    27     cin>>n>>v;
    28     
    29     for(int i=0;i<n;i++)
    30         cin>>capacity[i]>>value[i];
    31     
    32     memset(dp,0,sizeof(dp));
    33     
    34     for(int i=0;i<n;i++)
    35     {
    36         for(int j=capacity[i];j<=v;j++)
    37         {
    38             //if(j>=capacity[i])//由循环,j一定大于等于capacity[i] 
    39             dp[j]=max(dp[j],dp[j-capacity[i]]+value[i]);
    40         }
    41     }
    42     
    43     cout<<dp[v]<<endl;
    44     
    45     return 0;
    46 }
    大佬见笑,,
  • 相关阅读:
    【bzoj2821】作诗(Poetize)
    ZOJ-2112-Dynamic Rankings(线段树套splay树)
    POJ- 2104 hdu 2665 (区间第k小 可持久化线段树)
    hust-1024-dance party(最大流--枚举,可行流判断)
    hdu-3046-Pleasant sheep and big big wolf(最大流最小割)
    POJ-3294-Life Forms(后缀数组-不小于 k 个字符串中的最长子串)
    POJ-Common Substrings(后缀数组-长度不小于 k 的公共子串的个数)
    POJ-2774-Long Long Message(后缀数组-最长公共子串)
    POJ-3693-Maximum repetition substring(后缀数组-重复次数最多的连续重复子串)
    spoj-694-Distinct Substrings(后缀数组)
  • 原文地址:https://www.cnblogs.com/xwl3109377858/p/10986891.html
Copyright © 2020-2023  润新知