| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贡献一个3000ms(g++)的代码/**
* POJ: 1742 Coins
*
* 多重背包特例: 物品价值 = 物品体积(Wi = Vi)
* 本题: 求dp[1...m] 中 dp[v] = v的个数
*/
/** ***/
#include <stdio.h>
#include <string.h>
#include <limits.h>
/** ***/
#define N 200 + 2
#define SIZE 100000 + 2
#define SUBMIT 1
/** ***/
#define max(a, b) ( (a) > (b) ? (a) : (b) )
/** ***/
int ans = 0;
int cnt = 0;
int ks[SIZE];
int dp[SIZE]; // dp
/** ***/
int main(void)
{
int cash = 0;
int kind = 0;
int in[N]; // input
#ifndef SUBMIT
freopen("input/1742", "r", stdin);
#endif
while ((2 == scanf("%d%d", &kind, &cash)) && (kind | cash)) {
/* init */
ans = 0;
cnt = 0;
memset(dp, 0, sizeof(dp));
/* input */
for (int i = 0; i < (kind << 1); ++i) {
scanf("%d", in + i);
}
/* convert */
for (int i = kind, j = 0; i < (kind << 1); ++i, ++j) {
for (int k = 1; k < in[i]; k <<= 1) {
ks[++cnt] = k * in[j];
in[i] -= k;
}
ks[++cnt] = in[i] * in[j];
}
/* dp */
for (int i = 1; i <= cnt; ++i) {
for (int v = cash; v >= ks[i]; --v) {
if (dp[v] != v) {
int val = dp[v - ks[i]] + ks[i];
if (val == v) {
++ans;
dp[v] = val;
}
}
}
}
/* output */
printf("%d\n", ans);
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator