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; } }