1837Balance

看了题解的,有个高手跟我说这道题目要用到dp统计,把原点偏移,即把不能表示的部分移到能够表示的区域。这个想法可能是用在-7500那里

我的一开始的想法是dp[i][j]  其中i表示i码,j表示j钩,dp表示是否平衡,但是无论怎么想都觉得这道题目不是dp,而是搜索,所以最后做不出来

看了人家的题解,才发现,我的决策变量找错了

dp[i][j]  其中i表示i码,j表示天平此时的平衡度,dp表示数量,而且值得注意的是,平衡度有可能是-7500,所以要用到dp偏移

理解了人家的想法,我也自己打了一个代码,可是错误了

dp[i][j+w[i]*c[k]+7500]+=dp[i-1][j+7500];老是把w跟c给用混了,所以以后在命名时得多加注意了

我的代码,通过了

#include "iostream"
#include "string.h"
using namespace std;
int dp[25][15000];
int main(){
  int m,n,i,c[30],w[30],j,k;
  while(cin>>m>>n){
    for(i=1;i<=m;i++)cin>>c[i];
    for(i=1;i<=n;i++)cin>>w[i];
    memset(dp,0,sizeof(dp));
    dp[0][7500]=1;
    for(i=1;i<=n;i++){
      for(j=-7500;j<=7500;j++){
        if(dp[i-1][j+7500]!=0){
          for(k=1;k<=m;k++){
            dp[i][j+w[i]*c[k]+7500]+=dp[i-1][j+7500];
            //cout<<dp[i][j+w[i]*c[k]+7500]<<' '<<j+w[i]*c[k]+7500<<endl;
          }
          //cout<<endl;
        }
      }
    }
    cout<<dp[n][7500]<<endl;
  }
}

 

posted @ 2013-09-03 18:26  龙城星  阅读(127)  评论(0编辑  收藏  举报