您的位置:首页 > 博客中心 > 互联网 >

【Luogu】【关卡2-15】动态规划的背包问题(2017年10月)

时间:2022-05-03 14:21

任务说明:这是最基础的动态规划。不过如果是第一次接触会有些难以理解。加油闯过这个坎。

P1060 开心的金明

小明的妈妈给小明N元钱,小明想买m件物品,每个物品价值为 价格*重要度,求出不超过N元钱的情况下,最多能买多少价值的物品,输出价值。

解法:直接的01背包问题,我居然还去看了书。。递推方程一次写不出来。方程需要记忆。

dp[i][j]表示前i件物品总价格不超过j元的最大总价值。

技术分享

需要学习下怎么在博客园输入latex公式orz。。。

技术分享技术分享
#include 
#include 
#include 
#include 

using namespace std;


int main() {
    int n, m;
    cin >> n >> m;
    int w[m][2];
    for (int i = 0; i < m; ++i) {
        cin >> w[i][0] >> w[i][1];
        w[i][1] *= w[i][0];
    }

    int dp[m+1][n+1];
    memset(dp, 0, sizeof(dp));

    for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (w[i-1][0] > j) { dp[i][j] = dp[i-1][j]; }
            else {
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1][0]] + w[i-1][1]);
            }
        }
    }
    cout << dp[m][n] << endl;

    return 0;
}
View Code

 

 

 

dp[0][j] = 0;

dp[i+1][j] =  

\dp[0][j] = 0;

dp[i+1][j] = \begin{cases}
dp[i][j] & \text{ if } w[i][0]>j

& \text max(dp[i][j], dp[i][j-w[i][0] + w[i][1]) & \text{ else }
\end{cases}

 

dp[0][j] = 0;

dp[i+1][j] = \begin{cases}
dp[i][j] & \text{ if } w[i][0]>j

& \text max(dp[i][j], dp[i][j-w[i][0] + w[i][1]) & \text{ else }
\end{cases}

 

小A点菜  

金明的预算方案  

采药  

装箱问题  

疯狂的采药

 

本类排行

今日推荐

热门手游