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 = ;
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-吴奶奶买鱼的更多相关文章
- [Swust OJ 465]--吴奶奶买鱼(0-1背包+dfs)
题目链接:http://acm.swust.edu.cn/problem/465/ 还有一道题只是描述不一样,方法一模一样(http://acm.swust.edu.cn/problem/644/) ...
- 收集一些关于OI/ACM的奇怪的东西……
一.代码: 1.求逆元(原理貌似就是拓展欧几里得,要求MOD是素数): int inv(int a) { if(a == 1) return 1; return ((MOD - MOD / a) * ...
- 【转】lonekight@xmu·ACM/ICPC 回忆录
转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...
- 膜拜acm大牛 虽然我不会这题,但是AC还是没有问题的~(转自hzwer)
wywcgs: 亦称Lord Wu,俗名吴垠,2009级厦门大学智能科学与技术学院研究生,本科就读于哈尔滨工业大学.因其深厚的算法功底与独到的思维方式,被尊为“吴教主”,至今声威犹存. 2006年起参 ...
- 一位学长的ACM总结(感触颇深)
发信人: fennec (fennec), 信区: Algorithm 标 题: acm 总结 by fennec 发信站: 吉林大学牡丹园站 (Wed Dec 8 16:27:55 2004) AC ...
- 楼天城楼教主的acm心路历程(作为励志用)
楼主个人博客:小杰博客 利用假期空暇之时,将这几年GCJ,ACM,TopCoder 參加的一些重要比赛作个 回顾.昨天是GCJ2006 的回顾,今天时间上更早一些吧,我如今还清晰记得3 年 前,我刚刚 ...
- 关于ACM,关于CSU
原文地址:http://tieba.baidu.com/p/2432943599 前言: 即将进入研二,ACM的事情也渐渐远去,记忆终将模糊,但那段奋斗永远让人热血沸腾.开个贴讲讲ACM与中南的故事, ...
- 如何学习ACM
我想对未来的同学有几句话要说: 1 我们几乎没有noi上来的队员,大家只能依靠后期的更加刻苦的努力. 2 我们没有专业的班级或者机制形成职业ACM队伍,所以大家只能尽早的投入进来,用尽一切课余时间去训 ...
- ACM退役记&&回忆录
ACM退役记 2017.9.19星期二,"九一八事变"八十六年后的第二天,永远记住这个日子,刚好是我报名ACM到现在,刚好满一年,而今天正是我注册杭州电子科技大学OJ的时间(就是这 ...
随机推荐
- 记一次安装体验:pwn工具
几天前删了JDK,结果和VM在一个目录中,结果VM全没了,重安走起 记载一下安装虚拟机出现的问题,官网一个字....慢,于是找了百度网盘,据说win10版本太低没法用,我就下了vw15.5.0(建立在 ...
- C++ 判断是文件还是文件夹
转载:https://www.csdn.net/gather_23/NtDaIg1sMDYtYmxvZwO0O0OO0O0O.html Windows平台代码如下: #include <wind ...
- 「BOI2007」Mokia
「BOI2007」Mokia 传送门 把查询拆成四部分然后容斥计算答案(二维前缀和) 然后 \(\text{CDQ}\) 分治算答案. 参考代码: #include <algorithm> ...
- CSS - 滑动门技术
1. 概念: 1.1 为了使各种特殊形状的背景能够自适应元素中文本内容的多少,出现了CSS滑动门技术. 1.2 使各种特殊形状的背景能够自由拉伸滑动,以适应元素内部的文本内容,可用性更强. 1.3 最 ...
- 01 MATLAB基本概念
基本概念 整数类型 相同整数类型相乘还是整数 整数与浮点数相乘是这种整数类型 不同整数类型不能相乘,除非强制类型转换 整数与整数相乘: >> x = uint32(120); >&g ...
- HTTP报文结构及Cookie、session区别
目录 万维网 HTTP超文本传输协议 特点 HTTP的报文结构. 下面介绍http请求报文最主要的一些特点 在服务器上存放用户的信息(Cookie) 实例: 工作原理: cookie中的主要内容: C ...
- pip使用镜像的方法
http://e.pypi.python.org/这个就是官网了,清华大学提供的 建议非清华大学校内的使用这个镜像: http://e.pypi.python.org/simple(这也是一个http ...
- Hadoop端口与界面
NameNode:7180 Cloudera Manager集群管理界面: NameNode:50070 NameNode Web UI/数据管理界面: NameNode:8020/9000 Ha ...
- 提高 Java 代码性能的各种技巧
Java 6,7,8 中的 String.intern – 字符串池 这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 ...
- Centos7 下vmware NAT模式配置网络连接与DNS
NAT模式配置网络 1.首先查看NAT模式下的网络 从这边可以知道我的vmware下的nat模式的网络是192.168.109.*网段 上图这个网段也可以修改为别的网段 2.NAT模式下的网关 3.配 ...