godfrey90 发表于 2013-2-1 09:30:51

poj1837解题报告

这是一个很典型的动态规划中的01背包问题,G个砝码,每个砝码有C种放法。我们就可以按砝码的个数划分状态,共有G种状态,每种状态有多个选择,每次加一个砝码为一次状态转移,状态转移方程为:
    for(i=1;i<gNum;i++){      for(j=0;j<=15000;j++){            for(k=0;k<cNum;k++){                value = j-C*G;                if((value>=0)&&(value<=15000)){                  metrix+=metrix;                }            }      }    }
最终得到G个砝码都放完时,值为0的那个状态的放法总数
Source CodeProblem: 1837User: godfrey90Memory: 1560KTime: 63MSLanguage: GCCResult: AcceptedSource Code#include <stdio.h>#define OFFSET 7500int metrix;int C;int G;int cNum,gNum;int read(){    scanf("%d",&cNum);    scanf("%d",&gNum);    int i=0;    for(i=0;i<cNum;i++){      scanf("%d",&C);    }    for(i=0;i<gNum;i++){      scanf("%d",&G);    }}int main(){    memset(metrix,0,sizeof(metrix));    read();    int i=0,j=0;    int value = 0;    for(j=0;j<cNum;j++){      value = G*C;      metrix++;    }    int k=0;    for(i=1;i<gNum;i++){      for(j=0;j<=15000;j++){            for(k=0;k<cNum;k++){                value = j-C*G;                if((value>=0)&&(value<=15000)){                  metrix+=metrix;                }            }      }    }    printf("%d\n",metrix);    return 0;}
页: [1]
查看完整版本: poj1837解题报告