POJ1837解题报告

昨天复习了下动态规划的基本知识,然后就拿了这道题来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——  一定要注重分析,写出了方程就成功了一般。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值