weixin_41429120 2021-08-15 18:43 采纳率: 34.6%
浏览 48
已结题

NOIP C++ 健康的荷斯坦 搜索问题

题目链接:[](【腾讯文档】20210815-
腾讯文档 腾讯文档-在线文档 https://docs.qq.com/doc/DY1ZTTUl6RExaZHFV )

【题目描述】
农民约翰以拥有世界上最健康的奶牛为傲. 他知道每种饲料中所包含的牛所需的最低的维他命量是多少. 请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少.
给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少.
维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解.
输入格式
第1行:一个整数V(1\le V\le 25)V(1≤V≤25),表示需要的维他命的种类数.
第2行:VV个整数(1\le(1≤每个数\le 1000)≤1000),表示牛每天需要的每种维他命的最小量.
第3行:一个整数G(1\le G\le 15)G(1≤G≤15),表示可用来喂牛的饲料的种数.
下面GG行,第n行表示编号为n饲料包含的各种维他命的量的多少.
输出格式
输出只有一行,包括
牛必需的最小的饲料种数PP
后面有PP个数,表示所选择的饲料编号(按从小到大排列).
如果有多个解,输出饲料序号最小的(即字典序最小).
输入样例#1
4
100 200 300 400
3
50 50 50 50
200 300 200 300
900 150 389 399

输出样例#1
输出#1
2 1 3

  • 写回答

1条回答 默认 最新

  • 诺er~ 2021-08-15 18:49
    关注

    DFS?

    
    #include<bits/stdc++.h>
    #define LL long long
    #define maxn (int)1e5
    #define INF 0x3f3f3f3f
    using namespace std;
    int ans[50];
    int arr[50][1200];
    int pre[50];
    int step;
     int T; int n,m;
     string S[maxn];
     char c[maxn];
     int sum[1200];
     int I=1;
     bool cmp(string a,string b)//排序,先按种类编号的个数排列,再按字典序排
     {
         if(a.size()!=b.size())  return a.size()<b.size();
         else return a<b;
     }
    void dfs(int idx)
    {
        if(idx>n){//判断
                memset(sum,0,sizeof(sum));
            for(int i=1;i<=step;++i)
            {
                int k=pre[i];
                for(int j=1;j<=T;++j)
                  sum[j]+=arr[k][j];
            }
            bool r=1;
            for(int i=1;i<=T;++i)
            if(ans[i]>sum[i]) {
                r=0;break;
            }
            if(r==1) {//如果满足要求就保存到字符数组里
                for(int i=1;i<=step;++i)
                c[i]=pre[i]+'0';
                string ss(c+1,c+step+1);
                S[I++]=ss;
            }
            return ;
        }
        pre[++step]=idx;
        dfs(idx+1);
        step--;
        dfs(idx+1);
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        cin>>T;
     
        for(int i=1;i<=T;++i)
        {
            cin>>ans[i];
        }
        cin>>n;
        for(int i=1;i<=n;++i)
            for(int j=1;j<=T;++j)
             cin>>arr[i][j];
        step=0;
        dfs(1);
        sort(S+1,S+I,cmp);
       // for(int i=1;i<I;++i) cout<<S[i]<<" ";
        cout<<S[1].size();
        int k=0;m=0;
        for(int i=0;i<S[1].size();++i)
        {
            k=k*10+(S[1][i]-'0');//因为是字符串,4,14写成414,但是编号最多十几,且编号按从小到大排列
            if(m<k) {
                    cout<<" "<<k;
                m=k;k=0;
            }
     
        }
     
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏

报告相同问题?

问题事件

  • 系统已结题 8月23日
  • 已采纳回答 8月15日
  • 修改了问题 8月15日
  • 赞助了问题酬金 8月15日
  • 展开全部

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度