思路: 完全背包
分析:
1 根据题目很容易分析出题目是裸的完全背包,但是经过题目的条件我们发现dp数组开不下(怒RE不解释)
2 然后发现题目说了所有的bonds的value都是1000的整数倍,因此这边我们把sum和所有value都除以1000这样就降低了空间,那么dp数组就可以开的下了
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N = 11; const int MAXN = 1000010; int sum , year , n , v[N] , w[N]; long long ans , dp[MAXN]; void solve(){ ans = sum; sum /= 1000; memset(dp , 0 , sizeof(dp)); for(int i = 1 ; i <= n ; i++) for(int j = v[i] ; j < MAXN ; j++) dp[j] = max(dp[j] , dp[j-v[i]]+w[i]); while(year--) ans += dp[ans/1000]; printf("%lld\n" , ans); } int main(){ int Case; scanf("%d" , &Case); while(Case--){ scanf("%d%d" , &sum , &year); scanf("%d" , &n); for(int i = 1 ; i <= n ; i++){ scanf("%d%d" , &v[i] , &w[i]); v[i] /= 1000; } solve(); } return 0; }