POJ2063 Investment

给你钱数,还有年数year,还有多少钱一年多少利息,问几年后最多的钱数(利息算到下一年的本金中)。

 

等于求year次完全揹包,完全揹包外面再套层循环即可。

 

钱初始值最大为100W。。。本来我想,开个100W的揹包。写完了,一直RE,在ZOJ上是SE,表示郁闷啊。

 

在poj上看了讨论版的,我郁闷了!100W是初始值啊,后面利息加上的话 = =。。。算算。。最多10%。。100W+100W*0.1+….,这个这个数。。我算算。。。是45259172。。。我刚编了个程序算出来的。做的时候看讨论版知道这个数了。。。

 

因为投资的钱都是1000的倍数,所以本金,投资的钱数除以1000再计算利息后再加上没除1000的本金再算下一个,这样的话,揹包的容量就大大缩小了!

 

[cpp] 
view plain
copy

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <iostream>  
  4. #include <string.h>  
  5. using namespace std;  
  6. int money[45001];  
  7. int main(void)  
  8. {  
  9.     int ncases,n,year,c;  
  10.     int w[11],v[11],temp;  
  11.     cin >> ncases;  
  12.     while( ncases– )  
  13.     {  
  14.         cin >> c >> year >> n;  
  15.         for(int i=0; i<n; i++)  
  16.         {  
  17.             cin >> w[i] >> v[i];  
  18.             w[i] /= 1000;  
  19.         }  
  20.         temp = c;  
  21.         for(int i=0; i<year; i++)  
  22.         {  
  23.             c = temp;  
  24.             c /= 1000;  
  25.             for(int k=0; k<=c; k++)  
  26.                 money[k] = 0;  
  27.             for(int k=0; k<n; k++)  
  28.                 for(int j=w[k]; j<=c; j++)  
  29.                     money[j] = max(money[j-w[k]]+v[k],money[j]);  
  30.             temp += money[c];  
  31.         }  
  32.         cout << temp << endl;  
  33.     }  
  34. return 0;  
  35. }  
  36. 另附python版的程序:
    #POJ2063 Investment
    def SolveInvestment():
    	W=12850
    	D=4
    	N=2
    	V=[4,3]
    	I=[400,250]
    
    	def DP(W):
    		W=int(W/1000)
    		DP=[[0 for i in range(W+1)]for j in range(N+1)]
    		for i in range(1,N+1):
    			K=int(floor(W/V[i-1]))
    			for w in range(W+1):
    				for k in range(1,K+1):
    					# print DP[i][w],"-->",
    					if DP[i-1][w-k*V[i-1]]+k*I[i-1]>DP[i][w]:
    						if w-k*V[i-1]>=0:
    							DP[i][w]=DP[i-1][w-k*V[i-1]]+k*I[i-1]
    							# print i-1,w-k*V[i-1],DP[i-1][w-k*V[i-1]],"+",k,I[i-1]
    					# print DP[i][wb]
    		return DP[N][W]
    	for year in range(D):
    		print "Year",year+1,":",W,"->",
    		Int=DP(W)
    		W+=Int
    		print W
    	return
点赞