标签:
对应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