2014
03-23

Balance

An investor invests a certain percentage of his assets into NINSTRUMENTS financial instruments. After each term, these instruments deduct a certain fixed administrative cost, followed by a fee that is a percentage of the amount that was invested at the beginning of the term, and then add a return, which is a (positive or negative) percentage of the amount invested at the beginning of the term. If any account drops to zero or below after such a transaction, it is considered closed (no fees are charged against it, and is treated as simply zero) until a rebalancing occurs. Rebalancing occurs after every NREBALANCE terms, where the total assets of the investor are redistributed according to the original ratios for the instruments. Without rebalancing, the investor’s assets would become dominated by the higher return instruments, which would expose them to more risk compared to a balanced investment plan. Note that it is possible that all instruments drop to zero, in which case they all remain closed for the remaining terms. You are to model the value of such an investment strategy and report the ending value in each instrument (before rebalancing, if it happens to land on a term when a rebalance is due). Compute your results using double precision (do not round intermediate values to pennies), but round your final answers to pennies.

The first line of the input contains the three positive integers:
NINSTRUMENTS NTERMS NREBALANCE
There are no more than 10 instruments, and the number of terms is at most 20. This is followed by 3 lines of floating-point numbers separated by spaces, in the following format:
FIXED_FEE(1) .. FIXED_FEE(NINSTRUMENTS)
PERCENTAGE_FEE(1) .. PERCENTAGE_FEE(NINSTRUMENTS)
PRINCIPAL_START(1) .. PRINCIPAL_START(NINSTRUMENTS)
Finally, there are NTERMS lines each containing NINSTRUMENTS floating-point numbers indicating the percentage return of each instrument in each term:
RETURN(1,1) .. RETURN(1,NINSTRUMENTS)
RETURN(2,1) .. RETURN(2,NINSTRUMENTS)
.
.
RETURN(NTERMS,1) .. RETURN(NTERMS,NINSTRUMENTS)
All percentages (PERCENTAGE_FEE and RETURN) are given as ratios, up to 4 decimal places. For example, a fee of 0.0002 means 0.02% of the investment in this instrument is deducted as a fee each term. FIXED_FEE and PRINCIPAL_START are non-negative floating-point numbers that are specified to 2 decimal places. At least one of the PRINCIPAL_START values is positive.

The first line of the input contains the three positive integers:
NINSTRUMENTS NTERMS NREBALANCE
There are no more than 10 instruments, and the number of terms is at most 20. This is followed by 3 lines of floating-point numbers separated by spaces, in the following format:
FIXED_FEE(1) .. FIXED_FEE(NINSTRUMENTS)
PERCENTAGE_FEE(1) .. PERCENTAGE_FEE(NINSTRUMENTS)
PRINCIPAL_START(1) .. PRINCIPAL_START(NINSTRUMENTS)
Finally, there are NTERMS lines each containing NINSTRUMENTS floating-point numbers indicating the percentage return of each instrument in each term:
RETURN(1,1) .. RETURN(1,NINSTRUMENTS)
RETURN(2,1) .. RETURN(2,NINSTRUMENTS)
.
.
RETURN(NTERMS,1) .. RETURN(NTERMS,NINSTRUMENTS)
All percentages (PERCENTAGE_FEE and RETURN) are given as ratios, up to 4 decimal places. For example, a fee of 0.0002 means 0.02% of the investment in this instrument is deducted as a fee each term. FIXED_FEE and PRINCIPAL_START are non-negative floating-point numbers that are specified to 2 decimal places. At least one of the PRINCIPAL_START values is positive.

4 10 5
5.00 10.00 20.00 50.00
0.002 0.001 0.0008 0.0005
150000.00 100000.00 75000.00 50000.00
0.10 0.05 -0.05 -0.85
0.10 0.05 -0.10 -0.85
0.10 0.05 -0.20 -0.85
0.10 0.05 -0.40 -0.85
0.10 0.05 -0.80 -0.85
0.10 0.05 -0.05 -0.90
0.10 0.05 -0.05 -0.90
0.10 0.05 -0.05 -0.90
0.10 0.05 -0.05 -0.85
0.10 0.05 -0.05 -0.85

237698.69 126086.01 57298.74 0.00

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;

#define inff 0x3fffffff
#define maxn 105
int dp[25][15000];
int p[25],w[25];
int n,m;
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
int i,j,k;
for(i=1;i<=n;i++)
scanf("%d",&p[i]);
for(i=1;i<=m;i++)
scanf("%d",&w[i]);
memset(dp,0,sizeof(dp));
dp[0][7500]=1;
for(i=1;i<=m;i++)
for(k=1;k<=15000;k++)
{
if(dp[i-1][k])
{
for(j=1;j<=n;j++)
dp[i][k+p[j]*w[i]]+=dp[i-1][k];

}
}
printf("%d\n",dp[m][7500]);
}
}