Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 28448 | Accepted: 9645 |
Description
Input
Output
Sample Input
3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0
Sample Output
8 4
Source
代码:1297MS
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; #define M 105 #define N 100005 int wight[M],cost[M],dp[N],user[N]; int main() { int i,j,n,m,ans; while(scanf("%d%d",&n,&m)!=EOF &&n && m) { for(i=1;i<=n;i++) cin>>wight[i]; for(i=1;i<=n;i++) cin>>cost[i]; memset(dp,0,sizeof(dp)); dp[0]=1;ans=0; for(i=1;i<=n;i++) { memset(user,0,sizeof(user)); //这里user表示的是这种钱币在到达某种状态时,用了多少。j表示要到达的状态,也就是钱的总额。 for(j=wight[i];j<=m;j++) { //如果该钱币总额状态没到过,而前一个状态到过,也就是说,只要加一个wight[i]表示的钱币就能到到该状态, //而到达前一状态还剩这类钱币,就表示该状态可以到达。 if(!dp[j] && dp[j-wight[i]] && user[j-wight[i]]+1<=cost[i]) { dp[j]=1; user[j]=user[j-wight[i]]+1; //用一个钱币到达了该状态,这一个钱币当然要加上。 ans++; //能到达的钱币总额状态加一。 } } } cout<<ans<<endl; } return 0; }
POJ 1742 Coins (多重背包),布布扣,bubuko.com
原文地址:http://blog.csdn.net/qq2256420822/article/details/38322539