DP - 完全揹包(求方案總數) - 買書
小明手裏有n元錢全部用來買書,書的價格爲10元,20元,50元,100元。
問小明有多少種買書方案?(每種書可購買多本)
輸入格式
一個整數 n,代表總共錢數。
輸出格式
一個整數,代表選擇方案種數。
數據範圍
0≤n≤1000
輸入樣例1:
20
輸出樣例1:
2
輸入樣例2:
15
輸出樣例2:
0
輸入樣例3:
0
輸出樣例3:
1
分析:
將手中的錢視作背包容量m,書的價格視作物品體積vi,問題轉化爲完全背包問題,求方案總數。
狀態表示: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[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;
}