poj 2063 Investment 完全背包问题
2013-09-06 19:36
387 查看
上来根据题目盲写完全背包
第一版代码
不是内存MLE 就是RE
尝试第内存进行优化,注意到题目中的一句话:The value of a bond is always a multiple of $1 000.
就是基金都是1000的倍数。
100万本金,40年,每年按1.1比率算,40年后就是4400万。
如果除以1000的话,就是4.4万。优化效果还是很明显的。
第二版代码
第一版代码
#include <iostream> #include <stdio.h> #include <stdio.h> #include <cstring> using namespace std; int BONDS[11],INTERNEST[11]; int START,YEARS; #define MAX_F 3800000 int F[MAX_F]; int G[MAX_F]; #define printf // int main() { int N; while(cin>>N) { int bound_nums; cin>>START>>YEARS; // START <= 100W YEARS <= 40 cin>> bound_nums; // bound_nums <= 10 for(int i=1;i<=bound_nums;i++) { cin>>BONDS[i]>>INTERNEST[i]; INTERNEST[i] += BONDS[i]; printf("bonds %d: %d %d\n",i,BONDS[i],INTERNEST[i]); } for(int y=1;y<=YEARS;y++) { printf("before %d years: %d\n",y,START); memset(F,0,sizeof(F)); memset(G,0,sizeof(G)); for(int i=1;i<=bound_nums;i++) { printf("************i=%d\n",i); for(int v=BONDS[i];v <= START ;v++) { int vlasti = F[ v- BONDS[i] ] + INTERNEST[i]; if(vlasti > F[v]) //买入第 { F[v] = vlasti; G[v] = BONDS[i] + G[v -BONDS[i] ]; printf("F[%d] =%d G[%d]=%d BONDS[%d]=%d\n",v,F[v],v,G[v],i,BONDS[i]); } } } int maxv = -1; int maxg = -1; for(int v=START;v>=0;--v) if(F[v] > maxv) { maxv = F[v]; maxg = G[v]; } START = maxv + (START - maxg); //这里要处理投资用掉的。剩下的要累积到下一年中去 printf("after %d years: %d maxg :%d \n",y,START,maxg); } cout<<START<<endl; } }
不是内存MLE 就是RE
尝试第内存进行优化,注意到题目中的一句话:The value of a bond is always a multiple of $1 000.
就是基金都是1000的倍数。
100万本金,40年,每年按1.1比率算,40年后就是4400万。
如果除以1000的话,就是4.4万。优化效果还是很明显的。
第二版代码
Source Code Problem: 2063 User: csjiaxin Memory: 832K Time: 407MS Language: C++ Result: Accepted Source Code #include <iostream> #include <stdio.h> #include <stdio.h> #include <cstring> using namespace std; int BONDS[11],INTERNEST[11],INTERNESTMOD[11]; int START,YEARS,STARTMOD; #define BASE 1000 #define MAX_F 50000 //100W *1.1 40次幂最多为4400W ,/1000最多为4.4万 int F[MAX_F]; int G[MAX_F]; int FMOD[MAX_F]; #define printf // int main() { int N; while(cin>>N) { for(int _n = 1;_n<=N;_n++) { int bound_nums; cin>>START>>YEARS; // START <= 100W YEARS <= 40 cin>> bound_nums; // bound_nums <= 10 for(int i=1;i<=bound_nums;i++) { cin>>BONDS[i]>>INTERNEST[i]; INTERNEST[i] += BONDS[i]; INTERNESTMOD[i] = INTERNEST[i] % BASE; INTERNEST[i] /= BASE; BONDS[i] /= BASE; printf("bonds %d: %d %d %d\n",i,BONDS[i],INTERNEST[i],INTERNESTMOD[i]); } STARTMOD = START%BASE; START /= BASE; for(int y=1;y<=YEARS;y++) { printf("before %d years: %d,%d\n",y,START,STARTMOD); memset(F,0,sizeof(F)); memset(G,0,sizeof(G)); memset(FMOD,0,sizeof(FMOD)); for(int i=1;i<=bound_nums;i++) { printf("************i=%d\n",i); for(int v=BONDS[i];v <= START ;v++) { int last_index = v-BONDS[i]; int vlasti = F[ last_index ] + INTERNEST[i]; int vlastimod = FMOD[ last_index] + INTERNESTMOD[i]; vlasti += vlastimod / 1000; vlastimod %= 1000; //这里注意下 if(vlasti > F[v] || ( vlasti == F[v] && vlastimod > FMOD[v] )) //买入第 { F[v] = vlasti; FMOD[v] = vlastimod; F[v] += FMOD[v] / BASE; FMOD[v] %= BASE; G[v] = BONDS[i] + G[v -BONDS[i] ]; printf("F[%d] =%d G[%d]=%d BONDS[%d]=%d FMOD[%d]=%d\n",v,F[v],v,G[v],i,BONDS[i],v,FMOD[v]); } } } int maxv = -1; int maxg = -1; int maxmod = -1; for(int v=START;v>=0;--v) if(F[v] > maxv || (F[v] == maxv && FMOD[v] > maxmod)) { maxv = F[v]; maxg = G[v]; maxmod = FMOD[v]; } START = maxv + (START - maxg); //这里要处理投资用掉的。剩下的要累积到下一年中去 STARTMOD += maxmod; START += STARTMOD/BASE; STARTMOD %= BASE; printf("after %d years: %d,%d maxg :%d \n",y,START,STARTMOD,maxg); } cout<<START*BASE+STARTMOD<<endl; } } }
相关文章推荐
- poj 2063 Investment 动态规划 完全背包问题
- Investment-----POJ_2063-----完全背包问题
- POJ 2063 Investment(完全背包问题)
- POJ 2063 Investment 完全背包问题
- POJ 2063 Investment【经典完全背包】
- poj 2063 Investment (dp 完全背包)
- POJ 2063 Investment(完全背包)
- POJ 2063 Investment 变形的完全背包
- POJ 2063 Investment【经典完全背包】
- poj 2063 Investment(完全背包)
- hdu 1963 poj 2063 Investment(完全背包)
- POJ 2063 Investment(完全背包)
- POJ 2063 Investment 完全背包
- poj 2063 zoj 2224 完全背包问题
- POJ 2063 Investment(完全背包)
- poj 2063 Investment (完全背包)
- POJ 2063 Investment【完全背包】
- poj 2063 Investment 多次完全背包
- POJ 2063 Investment (完全背包)
- POJ 2063 Investment 完全背包