poj 3132 Sum of Different Primes——DP

dp还是不会啊啊啊……今天被这个题虐惨了……主要是01背包都不会……去看了背包九讲的01背包部分,大概会写了,就是有两个地方不懂,以后再想吧……

一个是为什么dp[i][j]要初始化为0

二是为什么k的那层循环要在最里面

三是为什么k要倒着枚举……

求路过大神指点啊啊啊……

a27400 3132 Accepted 452K 0MS G++ 807B 2011-08-05 22:09:44
#include<cstdio>
#include
<cstring>
#include
<cstdlib>
#include
<cmath>
#include
<algorithm>

int prime[200];
int dp[1200][20];//dp[i][j]表示把i分成j份有几种
int top;
int isprime(int n)
{
if(n==0||n==1)
return 0;
if(n==2||n==3)
return 1;
int i;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int main(void)
{
int i,v;
for(i=0;i<=1199;i++)
{
if(isprime(i))
{
prime[top
++]=i;
}
}
top
--;
//printf("%d\n",top);
dp[0][0]=1;
for(i=0;i<=top;i++)//枚举所有的素数
{
for(v=1200;v>=0;v--)//对每个素数,加上去掉该素数有多少种
{
if(v>=prime[i])
{
for(int k=14;k>=1;k--)
dp[v][k]
+=dp[v-prime[i]][k-1];
}
else break;
}
}
int n,k;
while(scanf("%d %d",&n,&k)==2)
{
if(!n&&!k)
{
break;
}
printf(
"%d\n",dp[n][k]);
}
}

  

你可能感兴趣的:(diff)