标签:思路 bsp long 并且 相同 std 转移 无法 pre
题目描述
输入
输出
样例输入
3 24
4 4 4
2 2 2
样例输出
18
题解
背包dp
考虑到方案数过多,无法作为状态;而总钱数较少,所以可以以此作为状态。
故设$f[i][j]$表示购买前$i$种皮肤,花费$j$元能够得到的最大方案数。那么可以直接枚举每个皮肤购买的数量然后转移 。
一个小trick:由于题目只要求判断是否达到m,因此当dp值大于m时直接将其赋为m(因为方案数是单调的,只要达到了m,以后的都会达到),避免高精度。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; long long f[125][250010] , p; int v[125] , c[125]; int main() { int n , i , j , k , m = 0; scanf("%d%lld" , &n , &p); for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &v[i]); f[0][0] = 1; for(i = 1 ; i <= n ; i ++ ) { scanf("%d" , &c[i]); for(j = 0 ; j <= m ; j ++ ) f[i][j] = f[i - 1][j]; for(j = 2 ; j <= v[i] ; j ++ ) for(k = c[i] * j ; k <= m + c[i] * j ; k ++ ) f[i][k] = min(p , max(f[i][k] , f[i - 1][k - c[i] * j] * j)); m += c[i] * v[i]; } for(i = 0 ; i <= m ; i ++ ) { if(f[n][i] >= p) { printf("%d\n" , i); return 0; } } return 0; }
标签:思路 bsp long 并且 相同 std 转移 无法 pre
原文地址:http://www.cnblogs.com/GXZlegend/p/7491399.html