poj1837(01背包)

解题思路:

每向天平中方一个重物,天平的状态就会改变,而这个状态可以由若干前一状态获得。

定义dp[i][j]为表示放入i个砝码后到达状态j的方法数。由于最重25,最多20个,长最多15,所以为25*20*15 = 7500,范围是-7500,7500,平横时j是0,但下标避免负数,为0-15000,平衡时为7500。

所以状态转移方程:dp[i][ j+ w[i]*c[k] ]= ∑(dp[i-1][j])

源码:

#include <iostream>
#include <memory.h>
using namespace std;
int dp[21][15001];//表示放入i个砝码后到达状态j
                  //最重25,最多20个,长最多15,
                  //所以为25*20*15 = 7500
                  //范围是-7500,7500,平横是0
                  //小标避免负数,为0-15000,平衡时7500
using namespace std;
int main()
{
    int n,g;
    int c[21];
    int w[21];
    cin>>n>>g;
    for(int i=1;i<=n;i++)
      cin>>c[i];
    for(int j=1;j<=g;j++)
      cin>>w[j];
    memset(dp,0,sizeof(dp));
    dp[0][7500] = 1;//最初无砝码平衡,1种方法
    for(int i=1;i<=g;i++)
      for(int j=0;j<=15000;j++)
       for(int k=1;k<=n;k++)
         dp[i][j+w[i]*c[k]] += dp[i-1][j];
    cout<<dp[g][7500]<<endl;
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值