• ACM-吴奶奶买鱼


    题目描述:吴奶奶买鱼
     
    吴奶奶有个可爱的外孙女——琪琪,她很喜欢小动物,尤其喜欢养鱼。为了让小孙女养到漂亮的小鱼,吴奶奶一大早就到花鸟鱼虫市场买鱼。这个市场可真大,里面有各种各样的宠物,就连宠物鱼都有好几十种。这些鱼实在是太美了,买的人越来越多,可是因为货源有限,卖鱼的老板不得不规定:同一种鱼,每个人最多只能买一条,并且有些鱼是不能一起买的,因为它们之间会互相争斗吞食。 吴奶奶想尽可能地买多些鱼,但可惜,她的资金有限,这可怎么办好呢?请编写一个程序帮助她。如果有多个方案都能买到尽可能多的鱼,则选择所花资金最多的一个。

    输入

    输入文件的第一行为两个正整数M(M≤1000),N(N≤30),分别表示吴奶奶的资金和鱼的种类。以下N行,每行有两个正整数S(1≤S≤N),T,分别表示某种鱼的编号以及该鱼的价格。
    接着,每行有两个整数P,Q。当P,Q大于0时,表示P,Q不能共处;当P,Q均等于0时,表示输入文件的结束。

    输出

    文件的第一行为两个正整数X,Y,分别表示所买鱼的条数和总花费。以下X行,每行有一个整数,表示所买鱼的编号。编号按升序排列输出。
    如果题目有多个解,只需输出其中一个。

    样例输入

    170 7
    1 70
    2 50
    3 30
    4 40
    5 40 
    6 30
    7 20
    1 4
    1 7
    3 4
    3 5
    5 7
    6 7
    0 0

    样例输出

    4 160
    2
    4
    5
    6

    思路:就是带附加条件的背包问题,只要单独判断附加条件即可。

    备注:这道写的有问题,测试用例对了,但是一直A不了。。。。。。。。。。。。。。。。。。。。
    #include<iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    const int MAX = 100;
    int mon, n, w[MAX], map[MAX][MAX];
    
    
    struct C
    {
        int cost, len;
        int path[MAX];
    } ans;
    
    struct yu
    {
        int num, w;
    }yyu[MAX];
    
    int cmp(int a, int b)
    {
        return a < b;
    }
    
    int check(int a[],int len,int inx)
    {
        for (int i = 0; i < len; i++)
        {
            if (map[inx][a[i]] == 1)
                return 0;
        }
        return 1;
    }
    
    
    void DFS(int pos, C cur)
    {
        //cout << "pos:" << pos << "	cur.len:" << cur.len << "	cur.cost:" << cur.cost << endl;
    
        if (pos >= n + 1)
        {
            if (cur.len > ans.len && (cur.len == ans.len && cur.cost > ans.cost)) ans = cur;        
    
            return;
        }
    
        if (cur.cost > mon) return;    
    
        if (check(cur.path,cur.len,pos))
        {        
            C temp = cur;
            temp.cost += yyu[pos].w;
            temp.path[temp.len++] = yyu[pos].num;
            DFS(pos + 1, temp);
        }    
        
        DFS(pos + 1, cur);
    
    }
    
    int main()
    {
        cin >> mon >> n;
        for (int i = 1; i <= n; i++)
            cin >> yyu[i].num >> yyu[i].w;
    
        int x, y;
        while (cin >> x >> y && (x||y))
        {        
            map[x][y] = 1;
            map[y][x] = 1;
        }
        
        C t;
        t.cost = 0;
        t.len = 0;
        memset(t.path, 0, sizeof(t.path));
    
        DFS(1, t);
    
        cout << ans.len << " " << ans.cost << endl;
        sort(ans.path, ans.path + ans.len, cmp);
        for (int i = 0; i < ans.len; i++)
            cout << ans.path[i] << endl;
    
        return 0;
    }

    后来改过之后可以AC了。

    初步猜测问题应该是:

    1.多组输入。

    2.鱼的编号问题,map矩阵代表鱼的标号矩阵,参数应该是鱼的编号,之前写成了索引,所以有问题。

    3.初始化问题,结构体输入需要初始化。

    备注:以后输入输出尽量选用同一种标准,不要一会用cincout,一会用scanfpprintf。

    正确的代码:

      1 // 吴奶奶买鱼.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 
      6 
      7 #include<iostream>
      8 #include <cstring>
      9 #include <cstdio>
     10 #include <algorithm>
     11 using namespace std;
     12 
     13 const int MAX = 100;
     14 int mon, n, w[MAX], map[MAX][MAX];
     15 
     16 
     17 struct C
     18 {
     19     int cost, len;
     20     int path[MAX];
     21     C()
     22     {
     23         cost = 0;
     24         len = 0;
     25         memset(path, 0, sizeof(path));
     26     }
     27 }ans;
     28 
     29 struct Yu
     30 {
     31     int num, w;
     32     Yu()
     33     {
     34         num = 0;
     35         w = 0;
     36     }
     37 }yyu[MAX];
     38 
     39 int cmp(int a, int b)
     40 {
     41     return a < b;
     42 }
     43 
     44 int check(int a[],int len,int inx)
     45 {
     46     for (int i = 0; i < len; i++)
     47     {
     48         if (map[inx][a[i]] == 1)
     49             return 0;
     50     }
     51     return 1;
     52 }
     53 
     54 
     55 void DFS(int pos, C cur)
     56 {
     57     //cout << "pos:" << pos << "	cur.len:" << cur.len << "	cur.cost:" << cur.cost << endl;
     58 
     59     if (pos >= n)
     60     {
     61         //cout << "pos:" << pos << "	cur.len:" << cur.len << "	cur.cost:" << cur.cost << endl;
     62         if ((cur.cost <= mon) && (cur.len > ans.len || (cur.len == ans.len && cur.cost > ans.cost)))
     63         {
     64             ans.len = cur.len;
     65             ans.cost = cur.cost;
     66             memcpy(ans.path, cur.path, sizeof(cur.path));
     67             //cout << "======================pos:" << pos << "	ans.len:" << ans.len << "	ans.cost:" << ans.cost << endl;
     68         }
     69         
     70         return;
     71     }
     72 
     73     if (cur.cost > mon) return;    
     74 
     75     if (check(cur.path,cur.len,yyu[pos].num))
     76     {        
     77         C temp = cur;
     78         temp.cost += yyu[pos].w;
     79         temp.path[temp.len++] = yyu[pos].num;
     80         DFS(pos + 1, temp);
     81     }    
     82     
     83     DFS(pos + 1, cur);
     84 
     85 }
     86 
     87 int main()
     88 {
     89     while (cin >> mon >> n)
     90     {        
     91         memset(map, 0, sizeof(map));
     92         
     93         for (int i = 0; i < n; i++)
     94             cin >> yyu[i].num >> yyu[i].w;
     95 
     96         int x, y;
     97         while (cin >> x >> y && (x || y))
     98         {
     99             map[x][y] = 1;
    100             map[y][x] = 1;
    101         }
    102 
    103         C t;
    104         t.cost = 0;
    105         t.len = 0;
    106         memset(t.path, 0, sizeof(t.path));
    107 
    108         DFS(0, t);
    109 
    110         cout << ans.len << " " << ans.cost << endl;
    111         sort(ans.path, ans.path + ans.len, cmp);
    112         for (int i = 0; i < ans.len; i++)
    113             cout << ans.path[i] << endl;
    114 
    115     }
    116     
    117 
    118     return 0;
    119 }
  • 相关阅读:
    8.20 附加赛3
    8.22 附加赛4
    Codeforces Round #505 (Div 1 + Div 2) (A~D)
    8.9 附加赛2
    8.10 正睿暑期集训营 Day7
    8.9 正睿暑期集训营 Day6
    8.8 正睿暑期集训营 Day5
    8.7 正睿暑期集训营 Day4
    8.6 正睿暑期集训营 Day3
    8.5 正睿暑期集训营 Day2
  • 原文地址:https://www.cnblogs.com/x739400043/p/8540811.html
Copyright © 2020-2023  润新知