标签:store letter ios tin buying script cas ase 问题
Value | Annual interest |
4000 3000 |
400 250 |
Input
Output
Sample Input
1
10000 4
2
4000 400
3000 250
Sample Output
14050
全背包问题。
题目大意 :每一年可以出售和购买债券,求n年最大的利息本金和。
题目分析 :这里其实和0-1背包问题差不多,只是我们不在逆序遍历了,因为还是逆序的话,就又成了0-1背包了。不过也可以用记忆化搜索去做,也是可以的,不难。
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #define maxn 2000010 using namespace std; long long d[maxn]; struct Node { int value;//价值 int extarl;//利息 }node[20]; void init() { memset(d, 0, sizeof(d)); memset(node, 0, sizeof(node)); } int main() { //freopen("in.txt", "r", stdin); int n,t, as = 0; int year; long long ans; //一定要用long long scanf("%d", &t); while (t--) { init(); scanf("%lld %d", &ans, &year); scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d %d", &node[i].value, &node[i].extarl); node[i].value /= 1000; } long long totans = ans; for(int k=0;k<year;k++) { if (k != 0) ans = totans; ans /= 1000; for(int i=1;i<=n;i++) for (int j = node[i].value; j <=ans; j++)//就是这个地方和0-1背包不同,可以好好想想为什么这样的话,就不一样了。 { d[j] = max(d[j], d[j - node[i].value] +node[i].extarl); } totans += d[ans]; } printf("%lld\n", totans); } return 0; }
标签:store letter ios tin buying script cas ase 问题
原文地址:http://www.cnblogs.com/7750-13/p/7375506.html