POJ 1742 Coins

其实跟这个很像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 }

 

posted @ 2012-04-18 15:59  浙西贫农  阅读(308)  评论(0编辑  收藏  举报