4 1
2 10
4 1
7 3
m ≤ 20000,小蛋糕總數量≤50.
這是是一個多重揹包問題
動態方程 dp[k] = min{dp[k-taste[i]]+1,dp[k]}dp[k]表示美味度爲k時最少的蛋糕數
就是,將第i個蛋糕拿出去得到的一個最少的找蛋糕數+1,和原蛋糕數相比最小的那個就是結果
另外一種思路,可以將所有的蛋糕的美味度都放在一個數組,就變成了0-1揹包問題,所需考慮的就是放不放的問題
#include <iostream>
#include <algorithm>
using namespace std;
int dp[20001];
int main() {
int m,n,taste[51],num[51];//taste數組用來盛放每個蛋糕的美味度,num用來盛放每個蛋糕的數量
cin>>m>>n;
for(int i=1;i<=n;i++)
cin>>taste[i]>>num[i];
for(int i=1;i<=m;i++)//初始化dp爲INF
dp[i]=99999;
for(int i=1;i<=n;i++)
for(int j=1;j<=num[i];j++)
for(int k=m;k>=taste[i];k--)
dp[k]=min(dp[k-taste[i]]+1,dp[k]);
if(dp[m]==99999)
cout<<"><"<<endl;
else
cout<<dp[m]<<endl;
return 0;
}