小明的旅行-潜水

终于,花了几天的时间,小明逛完了奇奇怪怪的城市B,今天是旅游的最后一天了,爸爸决定带着小明来游泳馆放松一下。这个时候正巧游泳馆在举行潜水比赛,于是爸爸又改变了主意,觉得小明还可以锻炼一下。潜水比赛的规则如下:
游泳馆共有n个潜水工具,每个潜水工具具有一定的重量和阻力以及固定的停留时间,小明弱不经风的身体只能背着重量最多为m的工具,以及承受阻力最多为v的工具(阻力太大会被水冲跑),谁在原地停留的时间最长谁就能取得最终的胜利。请你计算一下小明最长能在水底停留多久以及选择的工具分别是哪些。

输入描述

第一行为三个数 m,v,n 如题目所说。

接下来 n 行,每行三个数 a 
i

 ,b 
i

 ,c 
i

  分别表示第i个工具所含的重力,阻力,能够支撑的时间。

输出描述

第一行一个数,表示最长的时间。

接下来一行,若干个数,表示所选的物品。

用例输入 1 

100 100 3
50 60 289
40 10 116
50 50 106
用例输出 1 

405
1 2
提示

对于 100% 的数据,1≤m,v≤200,1≤n≤100。

数据保证一定有方案。

若有多种方案,输出前面尽量小的方案。

直接上代码:

#include <bits/stdc++.h>
using namespace std;
long long n,m,v,f[1005][1005];
string ans[1005][1005]; 
struct node {
    long long a,b,c;
} a[1005];
int main() {
    cin>>m>>v>>n;
    for(int i=1; i<=n; i++) cin>>a[i].a>>a[i].b>>a[i].c;
    for(int i=1; i<=n; i++)
        for(int j=m; j>=a[i].a; j--)
            for(int k=v; k>=a[i].b; k--) {
                if(f[j-a[i].a][k-a[i].b]+a[i].c>f[j][k] || f[j-a[i].a][k-a[i].b]+a[i].c==f[j][k] && ans[j-a[i].a][k-a[i].b]+char(i)<ans[j][k]){
                    f[j][k]=f[j-a[i].a][k-a[i].b]+a[i].c;
                    ans[j][k]=ans[j-a[i].a][k-a[i].b]+char(i);
                }
                    
            }

    cout<<f[m][v]<<"\n";
    for(int i=0; i<ans[m][v].size(); i++) 
        cout<<int(ans[m][v][i])<<" ";
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值