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]);
}
}
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号