DP——HDU 4571

  • 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4571

  • 题意:给出一个无向图(N个点,M条边,有重边),每条边有一个花费,每个节点有一个花费和一个价值(如果想获得价值,则必须付出花费,否则可以不用付出花费),求从点S到点E,在总花费不超过T的情况下的最大价值是多少

  • 分析:我们设置一个虚拟起点和一个虚拟终点,花费都为0,起点的价值为-1(保证任意点的价值都大于它),终点的价值为一个大数。然后起点到S的距离为0,到其它点的距离和到S一样;E到终点的距离为0,其它点到终点的距离和到E一样。设置DP[i][j]表示访问到点i并付出花费获得i点价值时,总花费为j的最大收获值。那么我们初始化DP[虚拟起点][0]为0,其它DP值为-1。那么只有当DP值不等于-1时,说明这个状态可抵达,我们就从这个状态继续往后扩展,找到能访问的点。

int c = cost[v]+MAP[u][v]+j;
//cout << u << "-" << v << " : " << MAP[u][v] << endl;
if(value[v]>value[u] && c<=T)
{
    DP[v][c] = max(DP[v][c], DP[u][j]+value[v]);
}
  • AC 代码:
/*************************************************************************
    > File Name: test.cpp
    > Author: Akira 
    > Mail: qaq.febr2.qaq@gmail.com 
 ************************************************************************/

#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <algorithm>
#include <bitset>
#include <queue>
#include <stack>
#include <map>
#include <cmath>
#include <vector>
#include <set>
#include <list>
#include <ctime>
#include <climits>
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define Sqr(a) ((a)*(a))
using namespace std;

#define MaxN 105
#define MaxM MaxN*10
#define INF 0x3f
#define PI 3.1415926535897932384626
const int mod = 1E9+7;
const double eps = 1e-6;
#define bug cout<<88888888<<endl;
#define debug(x) cout << #x" = " << x << endl;
int BigBang = 1000000;
int N,M,T,S,E;
int cost[MaxN],value[MaxN];
int MAP[MaxN][MaxN];
struct Scen 
{
    int id;
}ss[MaxN];
void Floyd()
{
    for(int k=0;k<N;k++)
        for(int i=0;i<N;i++)
            for(int j=0;j<N;j++)
                MAP[i][j] = min(MAP[i][j], MAP[i][k]+MAP[k][j]);
}
int DP[MaxN][3*MaxN];
int Begin;
int End;
int len;
void solve(int t)
{   
    //debug(MAP[S][E]);
    MST(DP,-1);
    DP[Begin][0] = 0;
    for(int i=0;i<len;i++)
    {
        int u = ss[i].id;
        for(int j=0;j<=T;j++)
        {
            if(DP[u][j]!=-1)
            {
                for(int k=i+1;k<len;k++)
                {
                    int v = ss[k].id;
                    int c = cost[v]+MAP[u][v];
                    if(value[v]>value[u] && j+c<=T)
                    {
                        DP[v][j+c] = max(DP[v][j+c], DP[u][j]+value[v]);
                    }
                }
            }
        }
    }
    int ans = BigBang;
    for(int j=0;j<=T;j++) ans = max(ans, DP[End][j]); 
    ans -= BigBang;
    printf("Case #%d:\n%d\n", t, ans);
}
int main()
{
    //std::ios::sync_with_stdio(false);
    int W;
    scanf("%d", &W);
    for(int t=1;t<=W;t++)
    {
        MST(MAP,INF);
        scanf("%d%d%d%d%d", &N, &M, &T, &S, &E);
        len = 0;
        Begin = N+1, End = N;
        cost[Begin] = cost[End] = 0, value[Begin] = -1, value[End] = BigBang;
        ss[len++].id = Begin,ss[len++].id = End;
        for(int i=0;i<N;i++) scanf("%d", &cost[i]);
        for(int i=0;i<N;i++) 
        {
            scanf("%d", &value[i]);
            ss[len++].id = i;
        }

        sort(ss,ss+len,[](Scen a, Scen b){return value[a.id]<value[b.id];});
        int u,v,L;
        while(M--)
        {
            scanf("%d%d%d", &u, &v, &L);
            MAP[u][v] = MAP[v][u] = min(L, MAP[u][v]);
        }
        Floyd();
        for(int i=0;i<N;i++)
        {
            MAP[Begin][i] = MAP[S][i];
            MAP[i][End] = MAP[i][E];
        }
        MAP[Begin][End] = MAP[S][E];
        MAP[Begin][S] = MAP[E][End] = 0;
        solve(t);
    }
    //system("pause");
}
内容概要:本文档提供了关于“微型车间生产线的设计与生产数据采集试验研究”的毕业设计复现代码,涵盖从论文结构生成、机械结构设计、PLC控制系统设计、生产数据采集与分析系统、有限元分析、进度管理、文献管理和论文排版系统的完整实现。通过Python代码和API调用,详细展示了各个模块的功能实现和相互协作。例如,利用SolidWorks API设计机械结构,通过PLC控制系统模拟生产流程,使用数据分析工具进行生产数据的采集和异常检测,以及利用进度管理系统规划项目时间表。 适合人群:具有机械工程、自动化控制或计算机编程基础的学生或研究人员,尤其是从事智能制造领域相关工作的人员。 使用场景及目标:①帮助学生或研究人员快速搭建和理解微型车间生产线的设计与实现;②提供完整的代码框架,便于修改和扩展以适应不同的应用场景;③作为教学或科研项目的参考资料,用于学习和研究智能制造技术。 阅读建议:此资源不仅包含详细的代码实现,还涉及多个学科领域的知识,如机械设计、电气控制、数据分析等。因此,在学习过程中,建议读者结合实际操作,逐步理解每个模块的功能和原理,并尝试调整参数以观察不同设置下的系统表现。同时,可以参考提供的文献资料,深入研究相关理论和技术背景。
本次的学生体质健康信息管理网站,按照用户的角色可以分为教师与学生,后台设置管理员角色来对学生的信息进行管理。,设计如下: 1、后台管理系统 后台管理系统主要是为该系统的管理员提供信息管理服务的系统,具体包括的功能模块如下: (1)管理员信息管理 (2)教师信息管理 (3)学生信息管理 (4)健康信息统计(图形化进行健康,亚健康等学生的信息数量统计) 2、教师角色的功能模块设计 教师角色所需要的功能模块主要包括了如下的一些内容: (1)个人资料修改 (2)学生体质健康管理:录入相关数据,包括但不限于身高、体重、肺活量、视力等生理指标以及运动能力、身体成分、骨密度等健康指标,并且设置健康,亚健康状态 (3)学生健康建议:根据体质信息,进行学生健康的建议 (4)健康预警:对健康出问题的学生,进行健康预警 (5)饮食和锻炼情况管理,查看 3、学生角色 学生角色可以通过该信息网站看到个人的基本信息,能够看到教师给与学生的健康建议等,功能模块设计如下: (1)个人资料修改 (2)我的健康建议查看 (3)我的健康预警 (4)饮食和锻炼情况管理,记录平时的饮食和锻炼情况 完整前后端源码,部署后可正常运行! 环境说明 开发语言:Java后端 框架:ssm,mybatis JDK版本:JDK1.8+ 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:eclipse/idea Maven包:Maven3.3+ 部署容器:tomcat7.5+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值