您的位置:首页 > 其它

hdu 2110 Crisis of HDU (完全背包求方案总数)

2014-02-20 20:05 423 查看
这题我寒假就写了一直写不对,找错误也找了很久就是找不对,某渣实在是太弱了,连一个裸的背包都写不对了

今天看到了一个大神写的代码之后终于找出了自己的错误,发帖警告自己以后别再犯

自己错误的原因:

在求解方案总数的过程没有取余

WA的代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<limits.h>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
int a[111];
int b[111];
int sum= 0;
for(int i= 1; i<= n; i++)
{
scanf("%d %d",&a[i],&b[i]);
sum+= a[i] * b[i];
}
if(sum%3)
{
printf("sorry\n");
continue;
}
int dp[11111];
memset(dp,0,sizeof(dp));
dp[0]= 1;
for(int i= 1; i<= n; i++)
for(int j= sum/3; j>= 1; j--)
for(int k= 1; k<= b[i]; k++)
if(j>= k * a[i])
dp[j]+= dp[j- k* a[i]];//此处需取余
else break;

if(dp[sum/3])
printf("%d\n",dp[sum/3]%10000);
else
printf("sorry\n");
}
return 0;
}


AC的代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<limits.h>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
int a[111];
int b[111];
int sum= 0;
for(int i= 1; i<= n; i++)
{
scanf("%d %d",&a[i],&b[i]);
sum+= a[i] * b[i];
}
if(sum%3)
{
printf("sorry\n");
continue;
}
int dp[11111];
memset(dp,0,sizeof(dp));
dp[0]= 1;
for(int i= 1; i<= n; i++)
for(int j= sum/3; j>= 1; j--)
for(int k= 1; k<= b[i]; k++)
if(j>= k * a[i])
dp[j]= (dp[j] + dp[j- k* a[i]]) % 10000;

if(dp[sum/3])
printf("%d\n",dp[sum/3]%10000);
else
printf("sorry\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: