题目:http://poj.org/problem?id=2063 题意:Jone 有M钱,有d种股票,给出每种股票的价值和年利息,给你y年的时间,使你的钱最多。 思路:典型的完全背包,可以参见背包九讲,需要注意的是The value of a bond is always a multiple of $1000,就是股票的价值是1000的倍数,这样就可以降低 时间复杂度了。。。。#include <stdio.h> #include <string.h> #include <iostream> using namespace std; const int maxn=50000; int t, money, year, d; int dp[maxn+10], v[20], inter[20]; int ans; int main() { // freopen("in.txt", "r", stdin); scanf("%d", &t); while (t--) { scanf("%d %d", &money, &year); scanf("%d", &d); for (int i=1; i<=d; i++) scanf("%d %d", &v[i], &inter[i]), v[i]/=1000; ans=money; for (int k=1; k<=year; k++) { money=ans/1000; memset(dp, 0, sizeof(dp)); for (int i=1; i<=d; i++) { for (int j=v[i]; j<=money; j++) { dp[j]=max(dp[j], dp[j-v[i]]+inter[i]); } } ans+=dp[money]; } printf("%d\n", ans); } return 0; }