cpa协会观景计划

 

 

2023年我们cpa协会又增加了新的成员,为了让学弟学妹们知道我们协会的财力,于是会长申请了一笔资金M,带大家去一个或者多个景点玩^_^,为了让大家玩得开心,贴心的会长亲自去了N个景点实地考察,记录了每一个景点大家去玩一共需要的花费V以及对于该景点的满意度S(满分为10),请计算出这一笔资金M能让大家获得的最大满意度之和MaxTotalS。

输入格式:

第一行输入M和N,随后N行依次输入name(该景点的名字),V(去该景点需要的花费),S(该景点的满意度)。

输出格式:

如果大家能出去玩就依次输出大家能去玩的景点名字(按数据输入的顺序从上到下输出),每一个名字后面都跟一个空格,第二行输出这几个景点的满意度之合。

如果哪里都去不了就只输出“insufficient funds.”

样例解释:

资金一共10,因此大家可以去:织金洞 ,阿西里西韭菜坪,百里杜鹃。一共花费2+2+5=9,会长对这几个景点的满意度之合9+7+9=25。

输入样例:

10 5
织金洞 2 9
阿西里西韭菜坪 2 7
织金古城 6 7
百里杜鹃 5 9
毕节市人民公园 4 8

输出样例:

织金洞 阿西里西韭菜坪 百里杜鹃 
25

题解代码:

// #include<bits/stdc++.h>  //二维数组解法
// using namespace std;
// const int MAXN = 1005;
// int v[MAXN];    // 体积
// int w[MAXN];    // 价值 
// int f[MAXN][MAXN];  // f[i][j], j体积下前i个物品的最大价值 
// string name[MAXN];  //景点名字
// int main()
// {
//     int n, m;
//     cin >> m >> n;
//     queue<string> visit[n+1][MAXN];
    
//     for(int i = 1; i <= n; i++)
//         cin>> name[i] >> v[i] >> w[i];

//     for(int i = 1; i <= n; i++)
//         for(int j = 1; j <= m; j++)
//         {
//             if(j < v[i]){  //  当前背包容量装不进第i个物品,则价值等于前i-1个物品,且参观的景点集合也为前i-1个。
//                 f[i][j] = f[i - 1][j];
//                 visit[i][j]=visit[i-1][j];
//             }else{        // 能装,需进行决策是否选择第i个物品
//                 f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
                
//                 if(f[i - 1][j]>f[i - 1][j - v[i]] + w[i]) visit[i][j]=visit[i-1][j];  //参观的景点集合为前i-1个。
//                 else{
//                     visit[i][j]=visit[i-1][j-v[i]];
//                     visit[i][j].push(name[i]);
//                 }
//             }
//         }
//     if(f[n][m]){
//         while(!visit[n][m].empty()){
//             cout<<visit[n][m].front()<<' ';
//             visit[n][m].pop();
//         }
//         cout << endl << f[n][m] << endl;
//     }else cout<<"insufficient funds.";
//     return 0;
// }



#include<bits/stdc++.h>   //一维数组解法
using namespace std;
const int MAXN = 1005;
int f[MAXN];
string a[MAXN];
int main() 
{
    int n, m;
    cin >> m >> n;
    for(int i = 1; i <= n; i++) {
        int v, w;
        string k;
        cin >> k >> v >> w;      // 边输入边处理
        for(int j = m; j >= v; j--){
            f[j] = max(f[j], f[j - v] + w);
            if(f[j]<=f[j-v]+w){  //选第i个物品
                a[j]=a[j-v]+k+' ';
            }
        }
    }
    if(f[m]){
        cout<<a[m]<<endl<<f[m];
    }else cout<<"insufficient funds.";
    return 0;
}

22软件  张某人

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值