B - Bone Collector
Description
Input
Output
Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1
Sample Output
14
分析:
f(n,m):花m元买n样东西实现的最大价值。对于任意的f(n,m),都有下面这两种情况:
情况一,你买了第n件商品,f(n, m)=f(n-1, m-pn)+vn,因为买了第n件商品,所以花费了pn元,也因此得到了vn的价值。f(n, m)就等于第n件商品的价值+用m-pn的钱去买n-1件商品的价值。这样问题就规模就变小了。
情况二,你不买第n件商品,f(n, m)=f(n-1, m),也就是说f(n, m)等于你用m元钱去买n-1件商品实现的最大价值。
这两种情况,哪个价值大,就取哪一种,所以f(n, m) = max(f(n-1, m-pn)+vn, f(n-1, m))。这便是这第一步的核心。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; struct bone { int a,b; } v[1010]; int main() { int t,n,m,i,j,f[1010]; scanf("%d",&t); while(t--) { memset(f,0,sizeof(f)); scanf("%d %d",&n,&m); for(i=0; i<n; i++) scanf("%d",&v[i].a); for(i=0; i<n; i++) scanf("%d",&v[i].b); for(i=0; i<n; i++) for(j=m;j>=v[i].b;j--) if(f[j]<f[j-v[i].b]+v[i].a) f[j]=f[j-v[i].b]+v[i].a; printf("%d\n",f[m]); } return 0; }