动态规划 背包问题
来源:互联网 发布:淘宝里的视频怎么转发 编辑:程序博客网 时间:2024/06/08 17:27
01背包问题
有n个重量和价值分别为wi和vi的物品,从这些物品中挑出总重量不超过W的物品,求所挑选方案中价值的最大值。
(1=<n<=100,1<=wi,vi<=100,1<=W<=10000)
dp[i+1][j]:从0到i+1个物品中选出总重量不超过j的物品同时总价值最大(dp[0][j]=0)
void solve(){ for(int i=0;i<n;i++){ for(int j=0;j<=W;j++){ if(j<w[i])dp[i+1][j]=dp[i][j];//能承受重量少于物品重量,则不能这个物品 else dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]);//要和不要求最大值 } } printf("%d\n",dp[n][W]);}01背包问题2
(1=<n<=100,1<=wi<=10000000,1<=vi<=100,1<=W<=1000000000)
当限制条件改变时(变大)
dp[i+1][j]:从0到i+1个物品中选出总价值为j时最小的重量(dp[0][0]=0,dp[0][j]=INF前0个物品中什么都挑选不了,所以初始值为INF)
int dp[MAX_N+1][MAX_N*MAX_V+1]void solve(){ fill(dp[0],dp[0]+MAX_N*MAX_V+1,INF); dp[0][0]=0; for(int i=0;i<n;i++){ for(int j=0;j<=MAX_N*MAX_V;j++){ if(j<v[i])dp[i+1][j]=dp[i][j]; else dp[i+1][j]=min(dp[i][j],dp[i][j-v[i]+w[i]); } } int res=0; for(int i=0;i<=MAX_N*MAX_V,i++){ if(dp[n][i]<=W)res=i;//n个物品都选了res为价值最大且不超过W的价值 } printf("%d\n",res);}
完全背包问题
有n个重量和价值分别为wi和vi的物品,从这些物品中挑出总重量不超过W的物品,每种物品任意选多件,求所挑选方案中价值的最大值。
void solve(){ for(int i=0;i<n;i++){ for(int j=0;j<=W;j++){ if(j<w[i])dp[i+1][j]=dp[i][j]; else dp[i+1][j]=max(dp[i][j],dp[i+1][j-w[i]]+v[i]); } } printf("%d\n",dp[n][W]);}
阅读全文
0 0
- 动态规划 背包问题
- 【动态规划】背包问题
- 动态规划-背包问题
- 动态规划+背包问题
- 动态规划-背包问题
- 背包问题 -- 动态规划
- 《背包问题》 动态规划
- 动态规划-背包问题
- 动态规划 背包问题
- 动态规划 背包问题
- 动态规划 背包问题
- 动态规划 背包问题
- 动态规划-背包问题
- 动态规划--背包问题
- 动态规划背包问题
- 背包问题 动态规划
- 动态规划-背包问题
- 动态规划-背包问题
- 学习机器学习之如何根据需求选择一种算法
- 477. Total Hamming Distance(C++)
- SpringCloud(第 049 篇)Netflix Eureka 源码深入剖析(上)
- Leetcode 712. Minimum ASCII Delete Sum for Two Strings
- Scala模式匹配
- 动态规划 背包问题
- 然而沼跃鱼早就看穿了一切
- c语言获取目录下的所有文件名
- 【Python】Python的类、对象、属性、方法
- NOIP模拟10.22
- 大数据学习23:hadoop-2.6.0-cdh5.7.0 编译,支持 native 和 snappy
- Ionic 简易侧拉框
- Photoshop——APP设计规范
- Android ImageView