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

输入

输入文件的第一行为两个正整数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 = ;
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 = ; i < len; i++)
{
if (map[inx][a[i]] == )
return ;
}
return ;
} void DFS(int pos, C cur)
{
//cout << "pos:" << pos << "\tcur.len:" << cur.len << "\tcur.cost:" << cur.cost << endl; if (pos >= n + )
{
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 + , temp);
} DFS(pos + , cur); } int main()
{
cin >> mon >> n;
for (int i = ; i <= n; i++)
cin >> yyu[i].num >> yyu[i].w; int x, y;
while (cin >> x >> y && (x||y))
{
map[x][y] = ;
map[y][x] = ;
} C t;
t.cost = ;
t.len = ;
memset(t.path, , sizeof(t.path)); DFS(, t); cout << ans.len << " " << ans.cost << endl;
sort(ans.path, ans.path + ans.len, cmp);
for (int i = ; i < ans.len; i++)
cout << ans.path[i] << endl; return ;
}

后来改过之后可以AC了。

初步猜测问题应该是:

1.多组输入。

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

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

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

正确的代码:

 // 吴奶奶买鱼.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" #include<iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std; const int MAX = ;
int mon, n, w[MAX], map[MAX][MAX]; struct C
{
int cost, len;
int path[MAX];
C()
{
cost = ;
len = ;
memset(path, , sizeof(path));
}
}ans; struct Yu
{
int num, w;
Yu()
{
num = ;
w = ;
}
}yyu[MAX]; int cmp(int a, int b)
{
return a < b;
} int check(int a[],int len,int inx)
{
for (int i = ; i < len; i++)
{
if (map[inx][a[i]] == )
return ;
}
return ;
} void DFS(int pos, C cur)
{
//cout << "pos:" << pos << "\tcur.len:" << cur.len << "\tcur.cost:" << cur.cost << endl; if (pos >= n)
{
//cout << "pos:" << pos << "\tcur.len:" << cur.len << "\tcur.cost:" << cur.cost << endl;
if ((cur.cost <= mon) && (cur.len > ans.len || (cur.len == ans.len && cur.cost > ans.cost)))
{
ans.len = cur.len;
ans.cost = cur.cost;
memcpy(ans.path, cur.path, sizeof(cur.path));
//cout << "======================pos:" << pos << "\tans.len:" << ans.len << "\tans.cost:" << ans.cost << endl;
} return;
} if (cur.cost > mon) return; if (check(cur.path,cur.len,yyu[pos].num))
{
C temp = cur;
temp.cost += yyu[pos].w;
temp.path[temp.len++] = yyu[pos].num;
DFS(pos + , temp);
} DFS(pos + , cur); } int main()
{
while (cin >> mon >> n)
{
memset(map, , sizeof(map)); for (int i = ; i < n; i++)
cin >> yyu[i].num >> yyu[i].w; int x, y;
while (cin >> x >> y && (x || y))
{
map[x][y] = ;
map[y][x] = ;
} C t;
t.cost = ;
t.len = ;
memset(t.path, , sizeof(t.path)); DFS(, t); cout << ans.len << " " << ans.cost << endl;
sort(ans.path, ans.path + ans.len, cmp);
for (int i = ; i < ans.len; i++)
cout << ans.path[i] << endl; } return ;
}

ACM-吴奶奶买鱼的更多相关文章

  1. [Swust OJ 465]--吴奶奶买鱼(0-1背包+dfs)

    题目链接:http://acm.swust.edu.cn/problem/465/ 还有一道题只是描述不一样,方法一模一样(http://acm.swust.edu.cn/problem/644/) ...

  2. 收集一些关于OI/ACM的奇怪的东西……

    一.代码: 1.求逆元(原理貌似就是拓展欧几里得,要求MOD是素数): int inv(int a) { if(a == 1) return 1; return ((MOD - MOD / a) * ...

  3. 【转】lonekight@xmu·ACM/ICPC 回忆录

    转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...

  4. 膜拜acm大牛 虽然我不会这题,但是AC还是没有问题的~(转自hzwer)

    wywcgs: 亦称Lord Wu,俗名吴垠,2009级厦门大学智能科学与技术学院研究生,本科就读于哈尔滨工业大学.因其深厚的算法功底与独到的思维方式,被尊为“吴教主”,至今声威犹存. 2006年起参 ...

  5. 一位学长的ACM总结(感触颇深)

    发信人: fennec (fennec), 信区: Algorithm 标 题: acm 总结 by fennec 发信站: 吉林大学牡丹园站 (Wed Dec 8 16:27:55 2004) AC ...

  6. 楼天城楼教主的acm心路历程(作为励志用)

    楼主个人博客:小杰博客 利用假期空暇之时,将这几年GCJ,ACM,TopCoder 參加的一些重要比赛作个 回顾.昨天是GCJ2006 的回顾,今天时间上更早一些吧,我如今还清晰记得3 年 前,我刚刚 ...

  7. 关于ACM,关于CSU

    原文地址:http://tieba.baidu.com/p/2432943599 前言: 即将进入研二,ACM的事情也渐渐远去,记忆终将模糊,但那段奋斗永远让人热血沸腾.开个贴讲讲ACM与中南的故事, ...

  8. 如何学习ACM

    我想对未来的同学有几句话要说: 1 我们几乎没有noi上来的队员,大家只能依靠后期的更加刻苦的努力. 2 我们没有专业的班级或者机制形成职业ACM队伍,所以大家只能尽早的投入进来,用尽一切课余时间去训 ...

  9. ACM退役记&&回忆录

    ACM退役记 2017.9.19星期二,"九一八事变"八十六年后的第二天,永远记住这个日子,刚好是我报名ACM到现在,刚好满一年,而今天正是我注册杭州电子科技大学OJ的时间(就是这 ...

随机推荐

  1. Python学习笔记009

    不换行 print("Hello,world!",end='')print("Hello,world!",end='')print("Hello,wo ...

  2. Duilib 修改程序exe、在任务栏以及任务管理器上的图标

    参考:https://blog.csdn.net/Rongbo_J/article/details/47379997       https://www.cnblogs.com/happinessda ...

  3. SpringBoot--⼯具表达式对象

    ⼯具表达式对象除了这些基本的对象之外,Thymeleaf将为我们提供⼀组⼯具对象,这些对象将帮助我们在表达式中执⾏常⻅任务.#execInfo:有关正在处理的模板的信息.#messages:⽤于在变量 ...

  4. HTTP出现前的协议

    前言 再HTTP普及之前,也就是从互联网的诞生期至今,曾出现过各式各样的协议.在HTTP规范确立之际,制定者们参考了那些协议的功能. 正文 1.FTP(File Transfer Protocol) ...

  5. 题解 AT1219 【歴史の研究】

    莫队 简单分析:题面含有IOI(惊),可知此题是IOI(数字三角形)难度(逃). 思路:回滚莫队 当然很多人都是抱着学回滚莫队的目标来看这道题的,所以这里介绍一下回滚莫队. 1.按莫队的思路讲询问排序 ...

  6. redis的并发set

    1.Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞争. 这里的并发 ...

  7. mybatis关键查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  8. day6 作业 购物车

  9. uni app中使用自定义图标库

    项目中难免会用到自定义图标,那在uni app中应该怎么使用呢? 首先, 将图标目录放在static资源目录下: 在main.js中引入就可以全局使用了 import '@/static/icon-o ...

  10. JVM源码分析-类加载场景实例分析

    A类调用B类的静态方法,除了加载B类,但是B类的一个未被调用的方法间接使用到的C类却也被加载了,这个有意思的场景来自一个提问:方法中使用的类型为何在未调用时尝试加载?. 场景如下: public cl ...