第2课 桐桐的运输方案《聪明人的游戏 信息学探秘.提高篇》

/*
第2课 桐桐的运输方案(transp)-2020-02-23

2019 CSP-J/S第一轮各省分数线统计与分析(含浙江省)
http://www.jzb.com/bbs/thread-7553499-1-1.html

CSP-J/S2019第二轮入门级一等各省评级分数线
http://www.zizzs.com/c/201912/41117.html

CSP-J/S2019第二轮提高级一等各省评级分数线
http://www.zizzs.com/c/201912/41116.html 
*/ 
#include <bits/stdc++.h>
using namespace std;

int n;
bool used[30],best[30]; 
double ans,x,w[30],v[30],f[30];

//search(1,0,0);
void search(int k,double weight,double m)
{
	//剪枝1 超重 
	if( weight > x ) return;
	
	//剪枝2 
	if( m>ans )
	{
		ans=m;
		
		//更新哪个物品选择了 
		for(int i=1;i<=n;++i)
		{
			best[i]=used[i];
		}
	}
	
	//碰到南墙就回头 
	if( k>n ) return;
	
	//剪枝3
	//2.要求所运送货物的总价值最大。
    //在第k步时,如果把后面剩下的所有物品都选择所得到的总价值都不比当前保存的最大价值大,
	//则不再搜索。
	if( m+f[k]<ans) return; 
/*
20
n=6
weight[i]
6  2   8  15  3   2
v[i]
5  8  10   2  1   1
f[i]
27 22 14   4  2   1
*/	
	//选择物品K 
	used[k]=true;
	search(k+1,weight+w[k],m+v[k]);
	
	//不选择物品K 
	used[k]=false;
	search(k+1,weight,m);
}
int main( void )
{
	//第1行是一个实数,表示货车的最大载货量x (1<x≤100)。
	//第2行是一个正整数,表示待运送的货物数n (1<n≤20)。
	cin>>x>>n;
	
	//后面n行每行两个用空格隔开的实数,
	//分别表示第1至第n件货物的质量W(weight)和价值V(value)。
	for(int i=1;i<=n;++i)
	{
		cin>>w[i]>>v[i];
	}
	 
	//o(n) 后缀数组 
	for(int i=n;i>=1;--i)
	{
		f[i]=f[i+1]+v[i];
	}
	
	ans=0;
	search(1,0,0);
	
	//第1行为被运送货物的总价值(只输出整数部分);
	cout<<(int)floor(ans)<<endl;
	
	//第2行为按编号大小顺序输出所有被运送货物的编号
	//(当一件都不能运送时,不输出)。
	for(int i=1;i<=n;++i)
	{
		if( best[i] )
		{
			cout<<i<<" ";
		}
	}
	cout<<endl;
	
	return 0;
}
/*
20
4
3.5  4
4    5
5    6.8
6.9  7

作业:
1.小学奥数_7647余数相同问题
http://noi.openjudge.cn/math/7647/

2、4.7算法之搜索
http://noi.openjudge.cn/ch0407/

3、2.5基本算法之搜索
http://noi.openjudge.cn/ch0205/ 
*/


2.5基本算法之搜索

OpenJudge - OpenJudge - 题目

4.7算法之搜索

OpenJudge - OpenJudge - 题目

1317:【例5.2】组合的输出

信息学奥赛一本通(C++版)在线评测系统

1318:【例5.3】自然数的拆分

信息学奥赛一本通(C++版)在线评测系统

1212:LETTERS

信息学奥赛一本通(C++版)在线评测系统

1213:八皇后问题

信息学奥赛一本通(C++版)在线评测系统

1214:八皇后

信息学奥赛一本通(C++版)在线评测系统

 




 


 



 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dllglvzhenfeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值