对应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