题目链接 http://poj.org/problem?id=1742
| Time Limit: 3000MS | Memory Limit: 30000K | |
| Total Submissions: 31612 | Accepted: 10756 |
Description
You are to write a program which reads n,m,A1,A2,A3...An and C1,C2,C3...Cn corresponding to the number of Tony's coins of value A1,A2,A3...An then calculate how many prices(form 1 to m) Tony can pay use these coins.
Input
Output
Sample Input
3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0
Sample Output
8 4
Source
这题和HDU 2844是一模一样的,但是HDU的数据比较弱,用二进制优化后的代码是无法在poj上面通过的,会超时。
HDU 2844 用二进制优化 http://blog.youkuaiyun.com/chenninggo/article/details/48321197
这题还是要用dp,记录该种硬币在和为 i 时用了几枚
具体看代码
/*
用dp记录当前i价值能不能组成
用sum数组记录组成i价值时用了多少枚该种硬币,注意该种硬币的使用次数不能超过该硬币所拥有的数目
当当前i价值无法组成时,进行动归
*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n, m;
int dp[100010], sum[100010];
int val[110], c[110];
int main()
{
// freopen("input.txt", "r", stdin);
while (scanf("%d%d", &n, &m) != EOF && n && m)
{
for (int i = 1; i <= n; i++)
scanf("%d", &val[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &c[i]);
memset(dp, 0, sizeof(dp));
dp[0] = 1;
int ans = 0;
for (int i = 1; i <= n; i++)
{
memset(sum, 0, sizeof(sum));
for (int l = val[i]; l <= m; l++)
{
if (!dp[l] && dp[l - val[i]] && sum[l - val[i]] < c[i])
{
dp[l] = 1;
sum[l] = sum[l - val[i]] + 1;
ans++;
}
}
}
printf("%d\n", ans);
}
return 0;
}
3542



被折叠的 条评论
为什么被折叠?



