【bzoj1531】[POI2005]Bank notes 多重揹包dp
阿新 • • 發佈:2018-12-12
演算法:單調佇列/二進位制 優化多重揹包
難度:NOIP
首先,他是一個裸的多重揹包,所以我們來貼一個暴力程式碼吧,時間複雜度O(n*v*val)
程式碼如下:
#include <cstdio> #include <iostream> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <queue> #define N 20005 #define ll long long using namespace std; int val[N],num[N]; int dp[N]; int main() { int n; scanf("%d",&n); for(int i = 1;i <= n;i++) { scanf("%d",&val[i]); } for(int i = 1;i <= n;i++) { scanf("%d",&num[i]); } int k; scanf("%d",&k); memset(dp,0x3f3f3f3f,sizeof(dp)); dp[0]=0;//!!! for(int i = 1;i <= n;i++) { for(int j = k; j >= val[i];j--) { for(int z = 0;z <= num[i];z++) { if(z*val[i]>j) break; dp[j]=min(dp[j],dp[j-z*val[i]]+z); } } } printf("%d\n",dp[k]); return 0 ; }