第5课 开心的金明《聪明人的游戏:信息学探秘.提高篇》(优化空间)

[NOIP2006 普及组] 开心的金明 - 洛谷

"""
第5课 开心的金明《聪明人的游戏:信息学探秘.提高篇》(优化空间) 
https://www.luogu.org/problemnew/show/P1060

"""

v=[0]*30

w=[0]*30

f=[0]*30005

n,m=map( int, input().split() )

for i in range( 1, m+1 ):

            x,y=map( int, input().split() )
            v[i]=x
            w[i]=y

for i in range( 1,m+1 ):

            j=n
            while j>=v[i]:

                        f[j]=max( f[j],f[ j-v[i] ]+v[i]*w[i] )

                        j-=1

print( f[n] )

/*

作业:6选3或6选2
 
1.采药(medic)
https://www.luogu.org/problemnew/show/P1048
http://ybt.ssoier.cn:8088/problem_show.php?pid=1932

1290:采药
http://ybt.ssoier.cn:8088/problem_show.php?pid=1290

1932:【05NOIP普及组】采药
http://ybt.ssoier.cn:8088/problem_show.php?pid=1932


2.1267:【例9.11】01背包问题
http://ybt.ssoier.cn:8088/problem_show.php?pid=1267

3.NOIP2001普及组 第4题 P1049 装箱问题(0/1 背包或枚举)
https://www.luogu.org/problemnew/show/P1049

4、1.6编程基础之一维数组_04:数组逆序重放
http://noi.openjudge.cn/ch0106/04/

5、1.6编程基础之一维数组_09:向量点积计算
http://noi.openjudge.cn/ch0106/09/

6、题单广场
https://www.luogu.com.cn/training/list 

*/




方法一:二维数组01背包 C++代码

#include <bits/stdc++.h>
using namespace std;
int n,m,v[30],w[30],f[30][30010];
int main()
{
	//第1行,为两个正整数,用一个空格隔开:N和m(其中N(<30000)
	//表示总钱数,m(<25)为希望购买物品的个数。) 
	cin>>n>>m;
	
	//从第2行到第m+1行,第j行给出了编号为j-1的物品的基本数据,
	//每行有2个非负整数v和p(其中v表示该物品的价格(v≤10000),
	//p表示该物品的重要度(1~5))
	for(int i=1;i<=m;i++)
	{
		cin>>v[i]>>w[i];
	}
	
	for(int i=1;i<=m;i++)
	for(int j=1;j<=n;j++)
	{
		if( j >= v[i] )
		{
			f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+v[i]*w[i]);
		}
		else
		{
		    f[i][j]=f[i-1][j];	
		}
	}
	
	//只有一个正整数,为不超过总钱数的物品的价格
	//与重要度乘积的总和的最大值(<100000000)。
	cout<<f[m][n]<<endl;
	
	return 0;
}



方法二:优化空间 C++代码

#include <bits/stdc++.h>
using namespace std;
int v[10000+10],w[10];
int main( void )
{
	int n,m;
	//n最大总价值 m种物品 
	cin>>n>>m;
	for(int i=1;i<=m;++i)
	{
		// w weight重要程度 v value 价格 
		cin>>v[i]>>w[i];
	}
	
	for(int i=1;i<=m;++i)
	for(int j=1;j<=n;++j)
	{
		if(j>=v[i])
		{
			f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+v[i]*w[i]);
			//f[i-1][j]:不选第i件物品
			//f[i-1][j-v[i]]+v[i]*w[i]:选第i件物品 
		}
		else
		{
			//因为j<v[i],如果选第i件物品的话会超过j的值
			//所以肯定不能先第i件物品 
			f[i][j]=f[i-1][j];
		}
	}
	
	cout<<f[m][n]<<endl;
	
	return 0;
}



 作业:6选3或6选2

1.采药(medic)

[NOIP2005 普及组] 采药 - 洛谷

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

1290:采药

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

1932:【05NOIP普及组】采药

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

2.1267:【例9.11】01背包问题

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

3.NOIP2001普及组 第4题 P1049 装箱问题(0/1 背包或枚举)

[NOIP2001 普及组] 装箱问题 - 洛谷

4、1.6编程基础之一维数组_04:数组逆序重放

OpenJudge - 04:数组逆序重放

5、1.6编程基础之一维数组_09:向量点积计算

OpenJudge - 09:向量点积计算

6、题单广场

题单列表 - 洛谷




 


 



 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dllglvzhenfeng

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

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

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

打赏作者

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

抵扣说明:

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

余额充值