题目:P2639 [USACO09OCT] Bessie’s Weight Problem G
题目描述
Bessie 像她的诸多姊妹一样,因为从 Farmer John 的草地吃了太多美味的草而长出了太多的赘肉。所以 FJ 将她置于一个及其严格的节食计划之中。她每天不能吃多过H ( 5 ≤ H ≤ 45 , 000 ) H (5 \le H \le 45,000)H(5≤H≤45,000)公斤的干草。 Bessie 只能吃一整捆干草;当她开始吃一捆干草的之后就再也停不下来了。她有一个完整的N ( 1 ≤ N ≤ 500 ) N (1 \le N \le 500)N(1≤N≤500)捆可以给她当作晚餐的干草的清单。她自然想要尽量吃到更多的干草。很自然地,每捆干草只能被吃一次(即使在列表中相同的重量可能出现2 22次,但是这表示的是两捆干草,其中每捆干草最多只能被吃掉一次)。 给定一个列表表示每捆干草的重量S i ( 1 ≤ S i ≤ H ) S_i (1 \le S_i \le H)Si(1≤Si≤H), 求 Bessie 不超过节食的限制的前提下可以吃掉多少干草(注意一旦她开始吃一捆干草就会把那一捆干草全部吃完)。
输入格式
第一行有两个由空格隔开的整数H HH和N NN。
第2 22到第N + 1 N+1N+1行,第i + 1 i+1i+1行是一个单独的整数,表示第i ii捆干草的重量S i S_iSi。
输出格式
第一行一个单独的整数表示 Bessie 在限制范围内最多可以吃多少公斤的干草。
输入输出样例 #1
输入 #1
56 4 15 19 20 21输出 #1
56说明/提示
输入说明
有四捆草,重量分别是15 , 19 , 20 15,19,2015,19,20和21 2121。Bessie 在56 5656公斤的限制范围内想要吃多少就可以吃多少。
输出说明
Bessie 可以吃3 33捆干草(重量分别为15 , 20 , 21 15, 20, 2115,20,21)。恰好达到她的56 5656公斤的限制。
代码1(二维数组)
#include<bits/stdc++.h>usingnamespacestd;constintN=500+10,M=45000+10;intn,V,v,f[N][M];intmain(){cin>>V>>n;for(inti=1;i<=n;i++){cin>>v;for(intj=0;j<=V;j++){f[i][j]=f[i-1][j];if(v<=j)f[i][j]=max(f[i][j],f[i-1][j-v]+v);}}cout<<f[n][V];return0;}代码2(一维数组)
#include<bits/stdc++.h>usingnamespacestd;constintM=45000+10;intn,V,v,f[M];intmain(){cin>>V>>n;for(inti=1;i<=n;i++){cin>>v;for(intj=V;j>=v;j--){f[j]=max(f[j],f[j-v]+v);}}cout<<f[V];return0;}