【DP】天平问题
天平問題
解題思路:
有n個砝碼,問可以稱出多少種重量,可以在左邊或者右邊放,也可以不放
原題:
題目描述
小C為了試驗小X,便為物競的小X出了一道物理相關的題:現在給出n個質量的砝碼,問小X能稱出多少種質量的物品,可是總有好事者想要破壞,于是乎,n達到了500,遠遠超出了小X能夠承受的范圍,鍥而不舍的他決定尋求你們的幫助。
輸入
第一行輸入一個的正整數N
以下N行每行一個不超過200的正整數,依次表示每個砝碼的質量。
輸出
輸出總共能稱出多少種不同質量的物品。
輸入樣例
3 1 3 9輸出樣例
13說明
注意:天平有兩邊,兩邊均可放。
解題思路:
用p[i][j]p[i][j]p[i][j]來表示前i個砝碼,是否可以稱出j,然后要不加aia_iai?,要不減aia_iai?,要不不加不減
代碼:
#include<map> #include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,ans,a[505],p[505][40005]; int main() {scanf("%d",&n);for (int i=1;i<=n;++i)scanf("%d",&a[i]);p[0][20000]=1;//往后推20000位,防止負數for (int i=1;i<=n;++i)for (int j=0;j<=40000;++j)if (p[i-1][j]){if (j+a[i]<40000) p[i][j+a[i]]=1;//加if (j-a[i]>=0) p[i][j-a[i]]=1;//減p[i][j]=1;//不加不減}for (int i=20001;i<=40000;++i)if (p[n][i])//判斷正整數ans++;printf("%d",ans); }總結
- 上一篇: 比昆仑更硬!小米发布龙晶玻璃 小米有史以
- 下一篇: 沙特阿拉伯和阿联酋的区别 沙特阿拉伯和阿