其实跟这个很像UVA的一个coins,但是那个是对每个硬币的使用次数没有限制,这次对这个有限制了。
这个限制怎么去破他,我想了好久好久。最终,还是没想出来,悲剧。后来网上搜了一下,发现这题还是楼教主的“男人不容易”系列中“男人八题”里的最简单的一道。 悲催了。
记录面值的话,每个面值搜过去就是了。但是这个次数的限制,就需要用另外一种状态去表示他了。
最核心的就是这个式子:if(used[j-a[i]]<c[i]) used[j]=used[j-a[i]]+1
贴代码:
View Code
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int dp[100010],used[100010],a[110],c[110]; 5 int main() 6 { 7 int n,m,i,j; 8 while(cin>>n>>m) 9 { 10 if(n == 0 && m == 0) 11 break; 12 for(i = 1;i <= n;i++) 13 cin>>a[i]; 14 for(i = 1;i <= n;i++) 15 cin>>c[i]; 16 memset(dp,0,sizeof(dp)); 17 dp[0] = 1; 18 for(i = 1;i <= n;i++) 19 { 20 memset(used,0,sizeof(used)); 21 for(j = 1;j <= m;j++) 22 { 23 if(j - a[i] >= 0 && !dp[j] && dp[j - a[i]] && used[j - a[i]] < c[i]) 24 { 25 dp[j] = 1; 26 used[j] = used[j - a[i]] + 1; 27 } 28 } 29 } 30 int sum = 0; 31 for(i = 1;i <= m;i++) 32 if(dp[i]) 33 sum++; 34 cout<<sum<<endl; 35 } 36 return 0; 37 }