Coins POJ - 1742(多重背包的可行性问题)

给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数。

Input

多组数据,每组数据前两个数字为n,m。n表示硬币种类数,m为最大面额,之后前n个数为每种硬币的面额,后n个数为相应每种硬币的个数。 (n<=100,m<=100000,面额<=100000,每种个数<=1000)

AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e5+6;
int is[maxn],sum[maxn],v[maxn],c[maxn];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n,m;
	while(cin>>n>>m){
		if(n==0&&m==0)break;
		for(int i=1;i<=n;i++)cin>>v[i];
		for(int i=1;i<=n;i++)cin>>c[i];
		memset(is,0,sizeof(is));
		is[0]=1;//is[]表明这个状态是否存在
		int ans=0; 
	    for(int i=1;i<=n;i++){
	    	memset(sum,0,sizeof(sum));
	    	for(int j=v[i];j<=m;j++){
	    		if(!is[j]&&is[j-v[i]]&&sum[j-v[i]]<c[i]){
	    			is[j]=1;
	    			sum[j]=sum[j-v[i]]+1;
	    			ans++;
				}
			}
		}
		cout<<ans<<endl; 
	}
}

猜你喜欢

转载自blog.csdn.net/Alanrookie/article/details/107469456