微信扫一扫打赏支持

完全背包

完全背包

分析:

解决完全背包游两个思路

1、利用单维数组前面结果后后面结果的影响从而实现每样物品取多件的效果

2、利用分组背包的思想,枚举每个物品取1->k件的效果

 

1、完全背包(单数组优化)

 1 //f[j]表示前i件物品花费j元的最大价值
 2 //f[j]=max(f[i-1][j],f[i-1][j-w[i]]+c[i])
 3 //f[j]=0
 4 
 5 #include <bits/stdc++.h>
 6 using namespace std;
 7 int f[105];
 8 int m,n;
 9 int w[105],c[105]; 
10 
11 int main(){
12     freopen("in2.txt","r",stdin); 
13     //初始化dp
14     memset(f,0,sizeof(f));
15     cin>>m>>n;
16     for(int i=1;i<=n;i++){
17         cin>>w[i]>>c[i];        
18     }
19     
20     
21     for(int i=1;i<=n;i++){
22         for(int j=1;j<=m;j++){
23             if(j>=w[i]){
24                 f[j]=max(f[j],f[j-w[i]]+c[i]);
25             }
26         }
27     }
28     cout<<f[m]<<endl;
29     
30     return 0;
31 } 
完全背包(单数组优化)

 

2、完全背包(分组背包单数组优化)

k是在状态转移方程里面的 

j的向前或者是向后只和维数相关

 1 //f[j]表示前i件物品花费j元的最大价值
 2 //f[j]=max(f[j],f[j-w[i]*k]+c[i]*k);
 3 //f[j]=0
 4 
 5 #include <bits/stdc++.h>
 6 using namespace std;
 7 int f[105];
 8 int m,n;
 9 int w[105],c[105]; 
10 
11 
12 int main(){
13     freopen("in2.txt","r",stdin); 
14     //初始化dp
15     memset(f,0,sizeof(f));
16     cin>>m>>n;
17     for(int i=1;i<=n;i++){
18         cin>>w[i]>>c[i];        
19         
20     }
21     
22 
23     //k是在状态转移方程里面的 
24     //j的向前或者是向后只和维数相关 
25         
26     for(int i=1;i<=n;i++){
27         for(int j=m;j>=1;j--){
28             int num=m/w[i];
29             for(int k=1;k<=num;k++){
30                 if(j>=w[i]*k){
31                     f[j]=max(f[j],f[j-w[i]*k]+c[i]*k);
32                 }
33             }
34         }
35     }
36     cout<<f[m]<<endl;
37     
38     return 0;
39 } 
40 
41 
42 //单数组
43 //可以边读入边动态规划么 
44 //01背包的分组背包
45 //01背包的分组背包的一维数组优化 
完全背包(分组背包单数组优化)

 

posted @ 2017-09-09 23:18  范仁义  阅读(339)  评论(0编辑  收藏  举报