[bzoj2748][HAOI2012]音量調節_動態規劃_背包dp
阿新 • • 發佈:2018-07-01
sound $1 IV sans 代碼 ace 更新 () highlight
音量調節 bzoj-2748 HAOI-2012
題目大意:有一個初值,給你n個$\delta$值,求最後不超過給定的限制的情況下的改變的最大值。每個$\delta$值可以+也可以-。
註釋:$1\le n\le 50$,$1\le 限制\le 1000$。
想法:正負背包。在背包的之後更新用兩行更新,保證每一個$\delta$值都被計入了答案。
最後,附上醜陋的代碼... ...
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int c[1001]; bool v[51][1001]; int main() { int n,beginsound,maxsound; scanf("%d%d%d",&n,&beginsound,&maxsound); for(int i=1;i<=n;i++) { scanf("%d",&c[i]); } v[0][beginsound]=1; for(int i=1;i<=n;i++) for(int j=0;j<=maxsound;j++) { if(j+c[i]<=maxsound) { if(v[i-1][j+c[i]]) v[i][j]=1; } if(j-c[i]>=0) { if(v[i-1][j-c[i]]) v[i][j]=1; } } for(int i=maxsound;i>=0;i--) { if(v[n][i]) { printf("%d",i); return 0; } } printf("-1"); return 0; }
小結:我們通常解題不過是將未知轉化成已知,或者探索未知而已。而這道題包括大部分的題都是前者。
[bzoj2748][HAOI2012]音量調節_動態規劃_背包dp