TYVJ 1214 :: 硬币问题

完全背包问题

一开始一直70,愣把我在TYVJ的AC率从一半拉到20%多。。内奔。。。

原因是因为赋初值的缘故,01背包是不太考虑这个问题的,因为只能选一次

由于是完全背包,所以循环次数跟01有区别,所以有一定几率dp[j]统一给的-1或者0值在多次计算之后比dp[j-cost[i]]+1大,这样就产生了非法计算,所以对这题要正无穷和负无穷。。顺便说这题是两次DP,一次是min一次是max,

 

MySolution
#include <stdio.h>
#include
<string.h>

#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))

long dp[10001], coin[101];

int main(){
long n, sum, i, j;
scanf (
"%ld %ld", &n, &sum );
for ( i = 0; i < n; i ++ )
scanf (
"%ld", &coin[i] );

for ( i = 0; i <= sum; i ++ )
dp[i]
= 10010;
dp[
0] = 0;
/*
当凑出面值为0的时候,使用了0个硬币
其余的全部按maxint处理
*/

for ( i = 0; i < n; i ++ )
for ( j = coin[i]; j <= sum; j ++ )
dp[j]
= min ( dp[j], dp[j-coin[i]]+1 );

printf (
"%ld\n", dp[sum] );

for ( i = 0; i <= sum; i ++ )
dp[i]
= -10010;
dp[
0] = 0;
/*
当凑出面值为0的时候,使用了0个硬币
其余的全部按-maxint处理
*/

for ( i = 0; i < n; i ++ )
for ( j = coin[i]; j <= sum; j ++ )
dp[j]
= max ( dp[j], dp[j-coin[i]]+1 );

printf (
"%ld\n", dp[sum] );

getchar(), getchar();
return 0;
}

posted on 2010-11-11 13:27  Jasper Ho  阅读(306)  评论(0编辑  收藏  举报

导航