刚出来的前端工资多少/福州百度首页优化
题目背景
直达通天路·小A历险记第三篇
题目描述
在猴王的帮助下,小A终于走出了这篇荒山,却发现一条波涛汹涌的河拦在了自己的面前。河面上并没有船,但好在小A有n个潜水工具。由于他还要背重重的背包,所以他只能背m重的工具,又因为他的力气并不是无限的,河却很宽,所以他只能背有v阻力的工具。但是这条河下有非常重要的数据,所以他希望能够停留的时间最久。于是他找到了你,让你告诉他方案。
输入格式
三个数m,v,n如题目所说
接下来n行,每行三个数ai,bi,ci分别表示所含的重力,阻力,能够支撑的时间
输出格式
第一行一个数,表示最长的时间
接下来一行,若干个数,表示所选的物品
输入输出样例
输入 #1 复制
100 100 3
50 60 289
40 10 116
50 50 106
输出 #1 复制
405
1 2
说明/提示
1<=m,v<=200,n<=100
数据保证一定有方案。
若有多种方案,输出前面尽量小的方案。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>using namespace std;const int maxn = 205;
int mm[maxn],vv[maxn],tt[maxn];struct DP
{int id[100];int l;int t;
}dp[maxn][maxn];int main()
{int m,v,n;scanf("%d%d%d",&m,&v,&n);for(int i = 1;i <= n;i++){scanf("%d%d%d",&mm[i],&vv[i],&tt[i]);}for(int i = 1;i <= n;i++){for(int j = m;j >= mm[i];j--){for(int k = v;k >= vv[i];k--){if(dp[j][k].t < dp[j - mm[i]][k - vv[i]].t + tt[i]){dp[j][k].t = dp[j - mm[i]][k - vv[i]].t + tt[i];int l;for(l = 1;l <= dp[j - mm[i]][k - vv[i]].l;l++){dp[j][k].id[l] = dp[j - mm[i]][k - vv[i]].id[l];}dp[j][k].l = dp[j - mm[i]][k - vv[i]].l + 1;dp[j][k].id[dp[j][k].l] = i;}}}}printf("%d\n",dp[m][v].t);for(int i = 1;i <= dp[m][v].l;i++){printf("%d ",dp[m][v].id[i]);}return 0;
}