首页 > 代码库 > 【HDOJ】2844 Coins
【HDOJ】2844 Coins
完全背包。
1 #include <stdio.h> 2 #include <string.h> 3 4 int a[105], c[105]; 5 int n, m; 6 int dp[100005]; 7 8 int mymax(int a, int b) { 9 return a>b ? a:b; 10 } 11 12 void CompletePack(int c) { 13 int i; 14 15 for (i=c; i<=m; ++i) 16 dp[i] = mymax(dp[i], dp[i-c]); 17 } 18 19 void ZeroOnePack(int c) { 20 int i; 21 22 for (i=m; i>=c; --i) 23 dp[i] = mymax(dp[i], dp[i-c]); 24 } 25 26 void multipack(int c, int n) { 27 int k; 28 if (c*n >= m) { 29 CompletePack(c); 30 return ; 31 } 32 k = 1; 33 while (k < n) { 34 ZeroOnePack(k*c); 35 n -= k; 36 k *= 2; 37 } 38 ZeroOnePack(n*c); 39 } 40 41 int main() { 42 int i, total; 43 44 while (scanf("%d%d",&n,&m)!=EOF && (n||m)) { 45 memset(dp, 0, sizeof(dp)); 46 dp[0] = 1; 47 for (i=1; i<=n; ++i) 48 scanf("%d", &a[i]); 49 for (i=1; i<=n; ++i) 50 scanf("%d", &c[i]); 51 for (i=1; i<=n; ++i) 52 multipack(a[i], c[i]); 53 total = 0; 54 for (i=1; i<=m; ++i) 55 if (dp[i]) 56 ++total; 57 printf("%d\n", total); 58 } 59 60 return 0; 61 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。