luogu1060_开心的金明(NOIP2006普及组第2题)

版权声明:本文为博主原创文章,未经博主允许不得转载,不得用于商业用途。 https://blog.csdn.net/WDAJSNHC/article/details/81571285

luogu1060_开心的金明(NOIP2006普及组第2题)

时空限制    1000ms/64MB

题目描述

金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 N 元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的 N 元。于是,他把每件物品规定了一个重要度,分为 5 等:用整数 1−5 表示,第 5 等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过 N 元(可以等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。

输入输出格式

输入格式:

第一行,为 2 个正整数,用一个空格隔开: Nm(其中 N(<30000) 表示总钱数, m(<25) 为希望购买物品的个数。)

从第 2 行到第 m+1 行,第 j 行给出了编号为 j−1 的物品的基本数据,每行有 2 个非负整数 vp  (其中 v 表示该物品的价格 (v≤10000), p 表示该物品的重要度( 1−5 )

输出格式:

1 个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值 (<100000000) 。

 

输入输出样例

输入样例#1:

1000 5
800 2
400 5
300 5
400 3
200 2

输出样例#1:

3900

 

代码

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 30005;
int n,m,f[N];

int main(){
	cin>>n>>m;
	for (int i=1,v,p; i<=m; i++){	//01背包
		cin>>v>>p;
		for (int j=n; j>=v; j--)
			f[j] = max(f[j],f[j-v]+v*p);
	}
	cout<<f[n]<<endl;
	return 0;
}

 

展开阅读全文

没有更多推荐了,返回首页