zoukankan      html  css  js  c++  java
  • P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)

    题目链接:点击进入

    题目分析:

    简单的组合背包模板题,但是递推的同时要刷新这种情况使用了哪些物品

    ac代码:

    #include<bits/stdc++.h>
    using namespace std;
    int weigh[101],zhu[101],t[101];
    struct student
    {
        int s;
        int number;
        int a[101];
    }f[201][201];
    int main()
    {
        std::ios::sync_with_stdio(false);
        int m,v,n;//m总重量,v总阻力,n物品数
        cin>>m>>v>>n;
        for(int i=1;i<=n;i++)  
        {
            cin>>weigh[i]>>zhu[i]>>t[i];//weigh个体重量,zhu个体阻力,t个体价值
        }
        for(int i=1;i<=n;i++)
            for(int mi=m;mi>=weigh[i];mi--)
                for(int vi=v;vi>=zhu[i];vi--)
                {
                    //printf("
    number=%d
    ",f[0][0].number);
                   if(f[mi][vi].s<f[mi-weigh[i]][vi-zhu[i]].s+t[i])
                   {
                      f[mi][vi].s=f[mi-weigh[i]][vi-zhu[i]].s+t[i];  
                       if(f[mi-weigh[i]][vi-zhu[i]].number==0)
                       {
                           f[mi][vi].a[1]=i;
                           f[mi][vi].number=1;
                       }
                       else
                       {
                           for(int x=1;x<=f[mi-weigh[i]][vi-zhu[i]].number;x++)
                           {
                               f[mi][vi].a[x]=f[mi-weigh[i]][vi-zhu[i]].a[x];
                           }
                           f[mi][vi].number=f[mi-weigh[i]][vi-zhu[i]].number+1;
                           f[mi][vi].a[f[mi][vi].number]=i;
                       }
                   }
                }
        int maxn=f[m][v].s,last_i=m,last_j=v;
        printf("%d
    ",maxn);
        for(int i=m;i>=0;i--)
            for(int j=v;j>=0;j--)
            {
                if(f[i][j].s!=maxn&&f[last_i][last_j].s==maxn)
                {
                    for(int x=1;x<=f[last_i][last_j].number;x++)
                    {
                        printf("%d ",f[last_i][last_j].a[x]);    
                    }
                //printf("%d",f[last_i][last_j].number);
                    return 0;
                }
                last_i=i;last_j=j;
            }
        return 0;
    }

    然后最后在找到相同时间下使用的最少物品情况就好了

    对于f数组可以用结构体存,这样更方便,顶多不好写,可是思路清晰

    我对于当前已经存了多少个数是从一开始记,所以用了if,else的分类讨论,防止出查错

  • 相关阅读:
    引入RabbitMQ后,如何保证全链路数据100%不丢
    使用logstash迁移elasticsearch
    内网代理转发工具
    MSSQL存储过程命令执行
    win10 家庭版升级专业版密钥
    clash TUN模式
    windows实战常用命令
    webshell之jsp免杀
    tmux的使用方法
    钓鱼邮件从入门到放弃
  • 原文地址:https://www.cnblogs.com/zyacmer/p/10046678.html
Copyright © 2011-2022 走看看