DP - 完全揹包(求方案總數) - 買書

DP - 完全揹包(求方案總數) - 買書

小明手裏有n元錢全部用來買書,書的價格爲10元,20元,50元,100元。

問小明有多少種買書方案?(每種書可購買多本)

輸入格式
一個整數 n,代表總共錢數。

輸出格式
一個整數,代表選擇方案種數。

數據範圍
0≤n≤1000

輸入樣例1:
20
輸出樣例1:
2

輸入樣例2:
15
輸出樣例2:
0

輸入樣例3:
0
輸出樣例3:
1

分析:

mvi將手中的錢視作揹包容量m,書的價格視作物品體積v_i,\\問題轉化爲完全揹包問題,求方案總數。

:f[i][j]:im:i:f[i][j]=f[i1][j]i:f[i][j]=f[i1][jv[i]]j>=v[i]狀態表示:f[i][j]:考慮前i種物品且體積不超過m的方案總數。\\狀態計算:\\①、不包含第i種物品:f[i][j]=f[i-1][j]。\\②、包含第i種物品:f[i][j]=f[i-1][j-v[i]],j>=v[i]。

f[i][j]=f[i1][j]+f[i1][jv[i]]j>=v[i]f[0][0]=1總計:f[i][j]=f[i-1][j]+f[i-1][j-v[i]],j>=v[i]。\\邊界:f[0][0]=1。\\可優化爲一維。


代碼:

#include<iostream>
#include<algorithm>

using namespace std;

const int N=1010;

int v[5]={0,10,20,50,100};
int n,f[N];

int main()
{
    cin>>n;
    
    f[0]=1;
    for(int i=1;i<=4;i++)
        for(int j=v[i];j<=n;j++)
            f[j]+=f[j-v[i]];
            
    cout<<f[n]<<endl;
    
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章