HDU-2844 Coins 【動態規劃DP+多重揹包】
阿新 • • 發佈:2018-11-19
題目:有n種硬幣,第i種硬幣的價值為Ai,數目為Ci,求這些硬幣能配出1~m中的幾種價值。
題解:dp[j]表示是否能配出價值j。sum[i][j]表示第i種硬幣取到價值j時需要的數目。sum陣列可以壓掉i的那一維,每次都要記得清零。
AC程式碼:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> using namespace std; #define io ios::sync_with_stdio(0),cin.tie(0) #define ms(arr) memset(arr,0,sizeof(arr)) #define inf 0x3f3f3f typedef long long ll; const int mod=1e9+7; const int maxn=1e5+7; int n,m; int a[110],c[110]; int dp[maxn],sum[maxn]; int main() { io; while(cin>>n>>m) { if(n==0&&m==0) break; for(int i=1; i<=n; i++) cin>>a[i]; for(int j=1;j<=n; j++) cin>>c[j]; ms(dp); dp[0]=1; int ans=0; for(int i=1; i<=n; i++) { ms(sum); for(int j=a[i]; j<=m; j++) { if(dp[j]==0&&dp[j-a[i]]==1&&sum[j-a[i]]<c[i]) { dp[j]=1; sum[j]=sum[j-a[i]]+1; ans++; } } } cout<<ans<<endl; } return 0; }