您的位置:首页 > 其它

poj 2063 Investment 完全背包问题

2013-09-06 19:36 387 查看
上来根据题目盲写完全背包

第一版代码

#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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: