现在的位置: 首页 > 综合 > 正文

POJ1837解题报告

2018年01月20日 ⁄ 综合 ⁄ 共 777字 ⁄ 字号 评论关闭

昨天复习了下动态规划的基本知识,然后就拿了这道题来AA。
题目的本质是求方程A1X1+A2X2+A3X3+......+AnXn=0解的个数。其中Ai表示挂钩离源点的距离,Xi表示物品重量(注意:某些Ai值可以相等,如可能出现A1=A5)。
看到数据量(c<=20,g<=20)时有种想用搜索的冲动,但是想了想实现的算法,发现搜索解决不了,枚举数量是20^n——太大啦!!!。
于是只能用DP了,DP方程如下f[v]=f[i-1][v-valure]+f[v],数组f初始化为零,由于会出现负数,所以数组需要些小处理,详情见代码:

#include <iostream>
#define N 7500
using namespace std;
int c,g,i,j,k,valure,x[20],w[20],f[20][15002];
int main()
{
   cin>>c>>g;
   for(i=0;i<c;i++)
     cin>>x[i];
   for(i=0;i<g;i++)
     cin>>w[i];
   memset(f,0,sizeof(f));
   for(i=0;i<c;i++)
     f[0][w[0]*x[i]+N]=1;
   for(i=1;i<g;i++)
     for(j=0;j<c;j++)
     {
       valure=w[i]*x[j];
       for(k=valure;k<15001;k++)
         f[i][k]+=f[i-1][k-valure];               
     }              
   cout<<f[g-1][N]<<endl;
}
看到代码是不是很无语啊- -,这么短!!!是的,就是这么短,但是这个DP却不好想,得先转化,然后就是递推求解了。

DP——  一定要注重分析,写出了方程就成功了一般。

【上篇】
【下篇】

抱歉!评论已关闭.