您的位置:首页 > Web前端

poj 3132 Sum of Different Primes——DP

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

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

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

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

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

a274003132Accepted452K0MSG++807B2011-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
[k]);
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: