zoukankan      html  css  js  c++  java
  • 完全背包问题

     完全背包问题

     

    输入样例

    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 }
    大佬见笑,,
  • 相关阅读:
    手机键盘
    关于大数除法
    整数转字符串,字符串转整数
    动态规划习题:数字三角形(01背包)
    关于最长不重复子串的问题
    Ubuntu12.04 下vim的使用(不断更新)
    Ubuntu12.04 如何设置环境变量
    LeetCode--Reverse Linked List II
    Ubuntu12.04 使用svn如何设置代理
    July面试整理系列--(5)
  • 原文地址:https://www.cnblogs.com/xwl3109377858/p/10986891.html
Copyright © 2011-2022 走看看