美文网首页
动态规划-购物单

动态规划-购物单

作者: taobao | 来源:发表于2021-07-28 11:38 被阅读0次

题目地址:https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4?tpId=37&tags=&title=&difficulty=0&judgeStatus=0&rp=1
完整代码:

#include <stdio.h>
#include <stdlib.h>

#define MAX(a,b) (a>b ? a : b)

int main(int argc, char *argv[])
{
    int max=0, num=0;
    scanf("%d %d", &max, &num);
    max /= 10;  //因为价格都是10的整数倍,整体除10,减少空间占用和计算次数
    
    int v=0,p=0,q=0;
    int V[61][3];  //记录价格,最多1主2付,三维度数组
    int P[61][3];  //记录重要度
    int DP[max+1];
    memset(V, 0, sizeof(V));
    memset(P, 0, sizeof(P));
    memset(DP, 0, sizeof(DP));
    //将数据处理到 二位数组中
    for(int i=1; i<=num; i++) {
        scanf("%d %d %d", &v, &p, &q);
        v /= 10;
        if (q == 0) {
            V[i][0] = v;
            P[i][0] = v*p*10;
        } else {
            if (V[q][1] == 0) {
                V[q][1] = v;
                P[q][1] = v*p*10;
            } else {
                V[q][2] = v;
                P[q][2] = v*p*10;
            }
        }
    }
    
    for(int i=1; i<=num; i++) {
        for(int n=max; n>=V[i][0]; n--) {
            //只有主
            int sum = V[i][0];
            int all = P[i][0];
            DP[n] = MAX(DP[n], DP[n-sum]+all);
            
            //如果有付1 主+付1
            if (V[i][1] > 0) {
                sum = V[i][0] + V[i][1];
                all = P[i][0] + P[i][1];
                if (n >= sum) {
                    DP[n] = MAX(DP[n], DP[n-sum]+all);
                }
            }
            
            //如果有付2 
            if (V[i][2] > 0) {
                //主+付2
                sum = V[i][0] + V[i][2];
                all = P[i][0] + P[i][2];
                if (n >= sum) {
                    DP[n] = MAX(DP[n], DP[n-sum]+all);
                }
                //主+付1+付2
                sum = V[i][0] + V[i][1] + V[i][2];
                all = P[i][0] + P[i][1] + P[i][2];
                if (n >= sum) {
                    DP[n] = MAX(DP[n], DP[n-sum]+all);
                }
            }
        }
    }
    printf("%d", DP[max]);
    
    return 0;
}

相关文章

  • 动态规划-购物单

    题目地址:https://www.nowcoder.com/practice/f9c6f980eeec43ef85...

  • Algorithm进阶计划 -- 动态规划(上)

    动态规划动态规划的基本原理动态规划的运用 1. 动态规划的基本原理 动态规划(Dynamic Programmi...

  • 4. 动态规划算法

    1. 动态规划算法总结2. 漫画:什么是动态规划?3.算法之动态规划4. 动态规划-算法

  • 动态规划 Dynamic Programming

    从运筹学和算法的角度综合介绍动态规划 算法分类总结动态规划与静态规划的关系浅析静态规划和动态规划动态规划解非线性规...

  • 《数据结构与算法之美》27——初识动态规划

    前言 今天开始学习动态规划,一共有三节,分别是:初识动态规划、动态规划理论、动态规划实战。今天这一节就是初识动态规...

  • 算法3:动态规划

    5.动态规划5.1 什么是动态规划?5.2 自底向上的动态规划:5.3 自顶向下的动态规划5.4 0-1背包问题:...

  • 动态规划

    动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...

  • Dynamic Programming(动态规划)类算法分析随笔

    #动态规划 关于动态规划,先摘一段[wiki][1]的描述: ``` 动态规划(英语:Dynamic progra...

  • 什么是动态规划

    目录 动态规划解决了什么 什么是动态规划 典型的动态规划 1. 动态规划解决了什么 的思想就是将大问题拆分成小问题...

  • 斐波那契数列

    递归解法 动态规划解法1 动态规划解法2

网友评论

      本文标题:动态规划-购物单

      本文链接:https://www.haomeiwen.com/subject/spkzmltx.html