0-1背包解析[以NYoj 289 苹果 为例]
2013-07-20 09:54
246 查看
/* 0-1背包 问题:N件物品和体积V的背包,第i件物品的体积是v[i]、价值是w[i]. 求解:哪些物品放入背包可以使背包物品价值最大. 特点:每种物品只有1件,所以每件物品只可以选择放或者不放. 状态转移方程:dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]); 解释:第i件物品只有两种状态,即放或者不放. 若不放,问题就转化为“前i-1件物品放入体积为V的问题". 若放,问题就成为”前i-1件物品放入体积为V-v[i]的问题“. 背包问题的初始化问题:恰好装满,dp[0]=0,dp[1.。V]=-∝. 价值最大(没有要求恰好装满):dp[0..V]=0; 0-1背包是最简单的背包,其他基础的背包都可以转化为0-1背包来进行求解. */ //二维实现 #include<stdio.h> #include<string.h> #define max(a,b) a>b?a:b int dp[1005][1005]; int main() { int N,V; while(scanf("%d%d",&N,&V)&&(N||V)) { int v[1005],w[1005]; memset(dp,0,sizeof(dp)); for(int i=1;i<=N;i++) scanf("%d%d",&v[i],&w[i]); for(int i=1;i<=N;i++) { for(int j=V;j>=0;j--) { if(j<v[i]) dp[i][j]=dp[i-1][j]; else dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]); } } printf("%d\n",dp [V]); } } //一维实现 #include<stdio.h> #include<string.h> #define max(a,b) a>b?a:b int main() { int N,V; while(scanf("%d%d",&N,&V)&&(N||V)) { int v[1005],w[1005],dp[1005]; memset(dp,0,sizeof(dp)); for(int i=1;i<=N;i++) scanf("%d%d",&v[i],&w[i]); for(int i=1;i<=N;i++) { for(int j=V;j>=v[i];j--) dp[j]=max(dp[j],dp[j-v[i]]+w[i]); } printf("%d\n",dp[V]); } }
相关文章推荐
- NYOJ 289 苹果 (0-1背包)
- nyoj 289 苹果 【01-背包】
- NYOJ289苹果背包系列
- NYOJ 289 苹果(简单的0-1背包)
- NYoj289苹果(0-1背包)
- NYoj289苹果(0-1背包)
- (NYoj 289)苹果 --01背包水题
- NYOJ-289 苹果 典型背包
- NYOJ 289 苹果 【0 1 背包】
- nyoj 289 苹果【裸0-1背包】
- nyoj289苹果
- 多重背包解析[以 NYoj 546 Divideing Jewels 为例]
- nyoj 289 苹果
- nyoj289苹果(广搜解01背包问题)
- NYOJ289 苹果 【01背包】
- 苹果(南阳oj289)(完全背包)
- nyoj 289 苹果 动态规划 (java)
- NYOJ 289 苹果 (dp问题之01背包)
- NYOJ289苹果
- NYOJ-289 苹果