标签:lib else ddl com stdio.h 遍历 algo 介绍 一个开始
刚开始理解01背包,有点难
介绍:
01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为C1,C2,…,Cn,与之相对应的价值为W1,W2,…,Wn.求解将那些物品装入背包可使总价值最大。
动态规划(DP):
1) 子问题定义:F[i][j]表示前i件物品中选取若干件物品放入剩余空间为j的背包中所能得到的最大价值。
2) 根据第i件物品放或不放进行决策
(1-1)
其中F[i-1][j]表示前i-1件物品中选取若干件物品放入剩余空间为j的背包中所能得到的最大价值;
而F[i-1][j-C[i]]+W[i]表示前i-1件物品中选取若干件物品放入剩余空间为j-C[i]的背包中所能取得的最大价值加上第i件物品的价值。
根据第i件物品放或是不放确定遍历到第i件物品时的状态F[i][j]。
设物品件数为N,背包容量为V,第i件物品体积为C[i],第i件物品价值为W[i]。
==============================================================
代码如下:暂时停留在公式理解层面
参考B站:https://www.bilibili.com/video/av36136952?from=search&seid=15783087569768174856
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #include <math.h> using namespace std; int w[1005],v[1005],dp[1005][1005]; int main() { int n,m; cin>>n>>m; //注意先输入价值!因为这个WA好几次 for(int i=1;i<=n;i++) cin>>v[i]; for(int i=1;i<=n;i++) cin>>w[i]; memset(dp,0,sizeof(dp));//dp数组初始化 for(int i=1;i<=n;i++) //物品从第一个开始遍历 { for(int j=0;j<=m;j++)//到m是因为如果之前一个都不取,可以到达m { //能装下w[i]时,比较dp[i-1][j]和dp[i-1][j-w[i]]+v[i] if(w[i]<=j) { dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]); printf("%5d %5d\n",dp[i-1][j],dp[i-1][j-w[i]]+v[i]); } //装不下则dp[i][j]=dp[i-1][j] else { dp[i][j]=dp[i-1][j]; printf("%5d \n",dp[i][j]); } } cout<<dp[n][m]<<endl;//肯定能到达m,dp[n][m]=max{dp[n-1][m],dp[n-1][m-w[i]]+v[i]} return 0; } }
标签:lib else ddl com stdio.h 遍历 algo 介绍 一个开始
原文地址:https://www.cnblogs.com/tttfu/p/10159165.html