标签:
http://poj.org/problem?id=1742
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
/** poj 1742 多重背包的可行性问题 题目大意:给定n种面值的硬币面值分别为wi个数为ci,问用这些硬币可以组成1~m之间的多少面值 解题思路:楼教主的男人八题之一,算是一个经典的问题,定义一个sum数组。每次填dp[j]时直接由dp[j-weight[i]]推出, 前提是sum[j-w[i]]<c[i].sum每填一行都要清零,sum[j]表示当前物品填充j大小的包需要至少使用多少个.复杂度O(n*m) */ #include <stdio.h> #include <string.h> #include <iostream> #include <iostream> using namespace std; int n,m; int w[105],c[105],sum[100005],dp[100005]; int main() { while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; for(int i=0;i<n;i++) { scanf("%d",&w[i]); } for(int i=0;i<n;i++) { scanf("%d",&c[i]); } memset(dp,0,sizeof(dp)); dp[0]=1; int ans=0; for(int i=0;i<n;i++) { memset(sum,0,sizeof(sum)); for(int j=w[i];j<=m;j++) { if(!dp[j]&&dp[j-w[i]]&&sum[j-w[i]]<c[i]) { dp[j]=1; sum[j]=sum[j-w[i]]+1; ans++; } } } printf("%d\n",ans); } return 0; }
标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/44422785