完全背包
2017-02-04 13:58
148 查看
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 7 const int MAXN=1005; 8 int w[MAXN],v[MAXN]; //代表第i个物品的重量,和价值 9 10 int N,W; //分别代表物品的个数,和包可以装的总物品重量 11 int dp[MAXN][MAXN]; 12 13 //穷竭搜索解决 14 int dfs(int i,int j){ 15 if(i==N) 16 return 0; 17 int res=-10000; 18 if(w[i]>j){ 19 res=dfs(i+1,j); 20 }else{ 21 for(int k=0;k*w[i]<=j;k++){ 22 res=max(res,dfs(i+1,j-k*w[i])+k*v[i]); 23 } 24 } 25 return res; 26 } 27 28 //记忆化搜索解决 29 int mdfs(int i,int j){ 30 if(i==N) 31 return 0; 32 if(dp[i][j]!=-1) 33 return dp[i][j]; 34 int res=-1000; 35 if(w[i]>j){ 36 res=mdfs(i+1,j); 37 }else{ 38 for(int k=0;k*w[i]<=j;k++){ 39 res=max(res,mdfs(i+1,j-k*w[i])+k*v[i]); 40 } 41 } 42 return dp[i][j]=res; 43 } 44 45 //DP解决 O(NW^2) 46 int DP(){ 47 memset(dp,0,sizeof(dp)); 48 for(int i=0;i<N;i++){ 49 for(int j=0;j<=W;j++){ 50 for(int k=0;k*w[i]<=j;k++){ 51 dp[i+1][j]=max(dp[i+1][j],dp[i][j-k*w[i]]+k*v[i]); 52 } 53 } 54 } 55 return dp [W]; 56 } 57 //DP解决 O(NW) 58 int DP2(){ 59 memset(dp,0,sizeof(dp)); 60 for(int i=0;i<N;i++) 61 for(int j=0;j<=W;j++) 62 if(w[i]<=j) 63 dp[i+1][j]=max(dp[i][j],dp[i+1][j-w[i]]+v[i]); 64 else dp[i+1][j]=dp[i][j]; 65 return dp [W]; 66 } 67 int main(){ 68 cin>>N>>W; 69 for(int i=0;i<N;i++){ 70 cin>>w[i]>>v[i]; 71 } 72 cout<<dfs(0,W)<<endl; 73 memset(dp,-1,sizeof(dp)); 74 cout<<mdfs(0,W)<<endl; 75 cout<<DP()<<endl; 76 cout<<DP2()<<endl; 77 }
相关文章推荐
- FATE(二维完全背包)
- 夕拾算法进阶篇:17)01背包和完全背包问题 (动态规划DP)
- HDU_3591_(多重背包+完全背包)
- 夕拾算法进阶篇:20)货币系统 (完全背包_动态规划DP)
- 01背包 完全背包
- hdu1114Piggy-Bank (完全背包)
- 背包问题总结(01背包、完全背包、多重背包)
- nyoj311 完全背包(dp)
- HDOJ 1114 Piggy-Bank(完全背包,水)
- hihocoder #1270 建造基地 完全背包
- 【HDU 3127】 完全背包
- 湫湫系列故事——减肥记I(杭电4508)(完全背包)
- bzoj 1655: [Usaco2006 Jan] Dollar Dayz 奶牛商店【高精度+完全背包】
- hdu1248(完全背包)
- HDU-1028 Ignatius and the Princess III(DP[完全背包]||生成函数)
- HDOJ(HDU).1284 钱币兑换问题 (DP 完全背包)
- UVa 10306 e-Coins(二维完全背包)
- 背包问题-完全背包-背包问题
- 完全背包 第三解法 一维以重量为阶段。
- nyoj311完全背包