hdu 4504(背包最优方案数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4504
View Code
1 /* 2 #include<iostream> 3 #include<cmath> 4 using namespace std; 5 int _count=0; 6 7 void dfs(int a,int b,int count){ 8 if(count==0){ 9 if(a>b)_count++; 10 return ; 11 }else if((b-a)<count){ 12 _count+=pow(3.0,count); 13 return ; 14 }else { 15 dfs(a+3,b,count-1); 16 dfs(a+2,b,count-1); 17 dfs(a+1,b,count-1); 18 } 19 } 20 21 int main(){ 22 int a,b,time; 23 while(~scanf("%d%d%d",&a,&b,&time)){ 24 _count=0; 25 if(time<15&&a<=b){ 26 printf("0\n"); 27 }else { 28 int count1=1+(time-15)/30; 29 int count2=(time-15)/30; 30 b+=count2; 31 if(a+2*count1<b){ 32 printf("0\n"); 33 }else if((b-a)<count1){ 34 printf("%d\n",pow(3.0,count1)); 35 }else { 36 dfs(a,b,count1); 37 printf("%d\n",_count); 38 } 39 } 40 } 41 return 0; 42 } 43 */ 44 45 #include<iostream> 46 #include<cstring> 47 using namespace std; 48 49 __int64 dp[24][77];//dp[i][j]表示第i次进攻后我方得分j(不算上原来的分数)时的最多方案数 50 51 void Initiate(){ 52 memset(dp,0,sizeof(dp)); 53 //最多进攻20次,最多得分为60. 54 dp[1][1]=dp[1][2]=dp[1][3]=1; 55 for(int i=1;i<=20;i++){ 56 for(int j=1;j<=60;j++){ 57 if(j>1)dp[i][j]+=dp[i-1][j-1]; 58 if(j>2)dp[i][j]+=dp[i-1][j-2]; 59 if(j>3)dp[i][j]+=dp[i-1][j-3]; 60 } 61 } 62 } 63 64 int main(){ 65 Initiate(); 66 int a,b,time; 67 while(~scanf("%d%d%d",&a,&b,&time)){ 68 int count=time/15; 69 int count1=(count+1)/2; 70 int count2=count-count1; 71 if(count1==0){ 72 if(a>b)printf("1\n"); 73 else printf("0\n"); 74 continue; 75 } 76 b+=count2; 77 int tmp=(b-a)+1; 78 if(tmp<0)tmp=0; 79 __int64 ans=0; 80 for(int i=tmp;i<=count1*3;i++){ 81 ans+=dp[count1][i]; 82 } 83 printf("%I64d\n",ans); 84 } 85 return 0; 86 }