搜索题----买鱼

题目描述:鱼的种类有多种,但有些鱼会互相攻击对方,在给定一定数目的钱时,怎么买尽可能多的鱼,并且要求找出在买的鱼数目相同的情况下所花的钱是最多的一个方案。

测试用例

输入

复制代码
1000 10
10 78
9 179
8 9
7 344
6 76
5 224
4 127
3 91
2 276
1 47
10 9
10 6
9 7
9 1
8 2
7 6
7 4
7 2
6 3
5 3
5 2
3 1
0 0
复制代码

输出

5 702
1
5
7
8
10

 

复制代码
#include <iostream>
using namespace std;

const int MAXSIZE = 31;//鱼的最大种类数
int m,n;//输入的钱数和鱼种类数
bool attack[MAXSIZE][MAXSIZE];//鱼之间的攻击性
int fish[MAXSIZE];//鱼的价格
int p[MAXSIZE];//买鱼的策略
int pbest[MAXSIZE];//买鱼的最佳策略
int cone,best;//买鱼的数目,最优数目
int sum,sumbest;//买鱼的花费,最优花费

void Solve(int t)
{
    
bool bb;
    
int i;
    p[t] 
= -1;
    
do 
    {
        p[t] 
= p[t]+1;
        
if (p[t]==1)
        {
//买下这种鱼
            ++cone;
            sum 
+= fish[t];
        }
        
//钱还有剩余
        if (sum<=m)
        {
            bb 
= true;
        }
        
else
            bb 
= false;
        
if (bb==true && p[t]==1)
        {
            
for (i=n;i>t;--i)
            {
                
//判断当前鱼与前面选择的是否互相攻击
                if (p[i]==1 && attack[i][t]==true)
                {
                    bb 
= false;
                    
break;
                }
            }
        }
        
if (bb==true)
        {
            
if (t==1)
            {
//到最后一种鱼了
                if(cone>best || (cone==best && sum>sumbest))
                {
//找到一个更优解
                    best = cone;
                    sumbest 
= sum;
                    
for (i=1;i<MAXSIZE;++i)
                    {
                        pbest[i] 
= p[i];
                    }
                }
            }
            
else
            {
//继续向下搜索
                Solve(t-1);
            }
        }

        
if (p[t]==1)
        {
//恢复到不买这种鱼的状态
            --cone;
            sum 
-= fish[t];
        }
    } 
while (p[t]!=1);
}

void Output()
{
//输出最优解
    cout<<best<<" "<<sumbest<<endl;
    
for (int i=1;i<=n;++i)
    {
        
if (pbest[i]==1)
        {
            cout
<<i<<endl;
        }
    }
}
int main()
{
    
int i,nId,nPrice,s,t;
    cin
>>m>>n;
    
//各种鱼的价格
    for (i=0;i<n;++i)
    {
        cin
>>nId>>nPrice;
        fish[nId] 
= nPrice;
    }
    
//鱼之间互相攻击对方的关系
    while(cin>>s>>&& (s!=0&&t!=0))
    {
        attack[s][t] 
= true;
        attack[t][s] 
= true;
    }
    best 
= 0;//鱼的最优数目
    sumbest = 0;//鱼的最优花费
    Solve(n);
    Output();
    system(
"pause");
    
return 0;
}
复制代码

posted on   Phinecos(洞庭散人)  阅读(1132)  评论(1编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2007-11-19 《VC++技术内幕》读后感
2007-11-19 一个简单的定时器(flex版)
2007-11-19 C++ Exercises(六)
2007-11-19 C++ Exercises(八)

导航

统计

点击右上角即可分享
微信分享提示