完全背包问题

 完全背包问题

 

输入样例
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 }

 

转载于:https://www.cnblogs.com/xwl3109377858/p/10986891.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值