题目描述
开心的金明
描述
金明今天很开心,家里购登的新房就要领钥匙了,新房里有一问他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只不过不超过N元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈限定的 N 元。于是,他把每件物品规定了一个重要度,分为 5 等;用整数 1-5 表示,第5 等最看要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过 元(可以等于元)的前提下,使每件物品的价格与重要度的乘积的总和最大。
设第j件物品的价格为v[j],重要度为 [],共选中了k件物品,编号依次为就j1.j2...jk.,所求的总和为:v[j1]x w[j1]+v[j2]x w[j2]+...+v[jk]xw[jk].
请帮助金明设计一个满足要求的购物单。
输入
第1行2个正整数n和m,用一个空格隔开,其中n(n<30000)表示总钱数,m(m≤25)为希望购买物品的个数。
从第2行到第m+1行,第i行给出了编号为-1的物品的基本数据,每行有2个非负整数v和p。其中,v表示该物品的价格(v10000);p 表示该物品的重要度(1~5),中间用一个空格隔开.
输出
一行一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值,一定不超过100000000.
输入样例 1
1000 5 800 2 400 5 300 5 400 3 200 2
输出样例 1
3900
耗子的思路
在不超过总(钱)数的情况下和最大,特别典型的01背包问题
请注意,01背包是在n件物品取出若干件放在大小为w的背包里。
但是每件物品只有一个!
把总价值看成(背包)容量,第i件物品的费用看成体积。
体积是w[i],价值是v[i]。
每种物品仅有一件,可以选择放或不放。求把哪些物品放入背包可一让这些物品的总费用不超过背包容量,且总价值最大。
dp[i][j]表示前i个物品放入一个容量是j的背包得到的最大价钱,由此推出动态转移方程:
dp[j]=max(dp[j],dp[j-v[i]]+v[i]*w[i]);
献上代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int v[40],w[40],dp[30005];
int main()
{
cin>>m>>n;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++)
{
for(int j=m;j>=v[i];j--)
{
dp[j]=max(dp[j],dp[j-v[i]]+v[i]*w[i]);
}
}
cout<<dp[m];
return 0;
}
完结撒花~