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的时间(就是这 ...
随机推荐
- springboot 模板
参考:https://blog.csdn.net/wangb_java/article/details/71775637
- swoole 监控文件改动
<?php /** * 场景: * 进程监控文件改动 */ date_default_timezone_set('PRC'); echo '进程id:' . posix_getpid() . P ...
- python学习 第一章(说不定会有第零章呢)one day
------------恢复内容开始------------ 一.啥是python python是吉尔·范罗苏姆于1989年开发的一个新的脚本解释程序,是ABC语言的一种继承. 二.python的特点 ...
- 搜索控制器UISearchController的使用
说明:本文主要是将系统UISearchController控件声明文件中的属性.方法.代理等介绍下,后续再联合[搜索栏UISearchBar]这篇文章一起更新更实用的信息. 1.初始化 // 如果设置 ...
- 【剑指Offer面试编程题】题目1388:跳台阶--九度OJ
题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n< ...
- Linux命令(1)
cd <directory> Short for "change directory". The shorthand name for the current dire ...
- CentOS配置源、wget、ifconfig基础环境
执行命令: curl http://10.200.0.14:8000/portal.cgi -X POST -d 'username=lishuai&password=test@cetc38& ...
- 常用的HBase命令
进入HBase shell:hbase shell 退出HBase shell:exit 查看HBase中所有的表:list 查看某个表中的记录总数:count 'table name' 查看某个表中 ...
- android 动态壁纸开发
转:http://www.eoeandroid.com/thread-100389-1-1.html android 动态壁纸开发参考:http://www.ophonesdn.com/article ...
- DatePicker和DataPickerDialog以及AutoCompleteTextView的基本使用方法
1.DatePicker和DatePickerDialog的基本使用方法: main.xml: <?xml version="1.0" encoding="utf- ...