1. 程式人生 > 實用技巧 >動態規劃基礎

動態規劃基礎

應我家小哥哥要求,將基礎的動態規劃寫上,有一說一,寫部落格比敲這個程式碼時間還長

揹包問題

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

記憶化搜尋