動態規劃基礎
阿新 • • 發佈:2020-07-20
應我家小哥哥要求,將基礎的動態規劃寫上,有一說一,寫部落格比敲這個程式碼時間還長
揹包問題
01揹包要點:1、物品多個,沒有種類之分
2、一般思維就是選與不選的區別
3、優化做法就是由題目要求遞推------------這裡是由最大找最大-------------有時候也是可以由最小找最小
補充一下第三點:若要硬生生的追求優化之前和優化之後的聯絡,就是對優化之前的程式碼求同存異,找不同罷了,但是我一般喜歡理解成大大大,小小小(小鯉魚,hh)
#include <iostream> #include <cstring> #include <string> #include <cmath> #include <cstdio> #include <stdio.h> #include <cstdlib> #include <algorithm> #include <vector> #include <set> #include <map> #include <queue> #include <iomanip> #define sf(n) scanf("%d",&n) #define pf(n) printf("%d\n",n) #define slf(n) scanf("lld",&n) #define plf(n) printf("lld\n",&n) #define rep(i,a,b) for(int i = a; i <= b ; i ++ ) #define pre(i,a,b) for(int i = b ; i >= a ; i --) #define ll long long #define inf 0x3f3f3f3f3f3f3fll #define ull unsigned long long #define ios ios::sync_with_stdio(false),cin.tie(0) using namespace std; typedef pair<int,int> PII ; const int N = 1010,mod=1e9+7; int v[N],w[N]; int f[N][N]; int n,m; // n==count m==V int main(int argc,int *argv) { ios; sf(n),sf(m); //want to get max(w) init f to zero rep(i,1,n) sf(v[i]),sf(w[i]); rep(i,1,n) { rep(j,1,m) { f[i][j]=f[i-1][j];//not select i_th if(j>=v[i])//select i_th f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]); } } pf(f[n][m]); return 0 ; }
#include <iostream> #include <cstring> #include <string> #include <cmath> #include <cstdio> #include <stdio.h> #include <cstdlib> #include <algorithm> #include <vector> #include <set> #include <map> #include <queue> #include <iomanip> #define sf(n) scanf("%d",&n) #define pf(n) printf("%d\n",n) #define slf(n) scanf("lld",&n) #define plf(n) printf("lld\n",&n) #define rep(i,a,b) for(int i = a; i <= b ; i ++ ) #define pre(i,a,b) for(int i = a ; i >= b ; i --) #define ll long long #define inf 0x3f3f3f3f3f3f3fll #define ull unsigned long long #define ios ios::sync_with_stdio(false),cin.tie(0) using namespace std; typedef pair<int,int> PII ; const int N = 1010,mod=1e9+7; int v[N],w[N]; int f[N]; int n,m; // n==count m==V int main(int argc,int *argv) { ios; sf(n),sf(m); //want to get max(w) init f to zero rep(i,1,n) sf(v[i]),sf(w[i]); rep(i,1,n) { pre(j,m,v[i]) { f[j]=max(f[j],f[j-v[i]]+w[i]); } } pf(f[m]); return 0 ; }
線性DP
區間DP
計數類DP
數位統計DP
狀態壓縮DP
樹形DP
記憶化搜尋