标签:
对应POJ题目:点击打开链接
Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 30387 | Accepted: 10325 |
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
题意:给出n个面额的硬币以及他们的数量,求能组合成多少种面额不同钱。
思路:多重背包。用dp[i]表示能否组成面额为i的钱,是1则可以,0则不可以。用一个数组记录某个体积使用的次数。
#include<cstdio> #include<iomanip> #include<iostream> #include<cstring> using namespace std; const int MAXN=100005; int a[105]; //价值 int b[105]; //数量 int w[MAXN]; //w[i]表示体积为i的模价值的同余类所用的数量 bool dp[MAXN]; int main() { //freopen("in.txt","r",stdin); int N,V; while(scanf("%d%d",&N,&V), N+V) { memset(dp,0,sizeof(dp)); int i,j; for(i=1; i<=N; i++) scanf("%d",&a[i]); for(i=1; i<=N; i++) scanf("%d",&b[i]); int sum=0; dp[0]=1; for(i=1; i<=N; i++){ memset(w,0,sizeof(w)); for(j=a[i]; j<=V; j++){ if(!dp[j] && dp[j-a[i]] && w[j-a[i]]<b[i]){ dp[j]=1; w[j]=w[j-a[i]]+1; sum++; } } } printf("%d\n",sum); } return 0; }
标签:
原文地址:http://blog.csdn.net/u013351484/article/details/45317315