题目:奖金
题目描述
在获得吞噬比赛的胜利后,主办方居然只给了M(0<=M<=10000)元,一番咒骂后,你为了庆祝一番,决定用这M元买点东西.现在有N(0<n<=5000)个种类的东西让你挑选,每个东西都有一个价格(0<=W<=M)和一个价值(0<=Q<=20000),每种东西都能挑无数个,现在,你的任务是:当这M元恰好花完时,使所挑选的物品价值总和最大
输入格式
第一行二个数N,M
接下来N行每行两个数,分别是价格和价值
输出格式
一个数,为当这M元恰好花完时,最大物品价值总和(数据保证存在解)
题解:————————————————————————————————————————
DP入门必扫题,但坑爹的是,数据里竟然有负数,试想谁碰到过花了钱买的物品价值会是负的,rqnoj出题人想象力真丰富。
代码实现:
#include<iostream> #include<cstring> using namespace std; int f[10001],v[5001],w[5001],m,n; int main() { int i,j; cin>>n>>m; for(i=1;i<=n;i++) cin>>v[i]>>w[i]; for(i=1;i<=m;i++) f[i]=-100000; for(i=1;i<=n;i++) for(j=v[i];j<=m;j++) if(f[j]<f[j-v[i]]+w[i]) f[j]=f[j-v[i]]+w[i]; cout<<f[m]<<endl; return 0; }