有多种钱币,每种钱币有限多个,多重背包。
附代码:
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; int dp[100005]; int w[1000]; int main(){ int n,m,a,b,cnt; while(cin >> n >> m){ cnt=0; memset(dp,0,sizeof(dp)); memset(w,0,sizeof(w)); for(int i=1;i<=m;i++){ cin >> a >> b; for(int j=1;j<=a;j*=2){ w[++cnt]=j*b; a-=j; } if(a>0){ w[++cnt]=a*b; } } for(int i=1;i<=cnt;i++) for(int j=n;j>=w[i];j--) dp[j]=max(dp[j],dp[j-w[i]]+w[i]); cout << dp[n] <<endl; } return 0; }