hdu 1284 完全背包

#include<stdio.h>
#include<string.h>
int a[3]={1,2,3};
int main()
{
	int n,c1[40000],c2[40000],j,k,i;

		memset(c1,0,sizeof(c1));
		memset(c2,0,sizeof(c2));
		for(i=0;i<=32768;i++)
			c1[i]=1;
		for(i=1;i<=2;i++)
		{
			for(j=0;j<=32768;j++)
				for(k=0;k+j<=32768;k=k+a[i])
					c2[k+j]+=c1[j];
				for(j=0;j<=32768;j++)
				{
					c1[j]=c2[j];
					c2[j]=0;
				}
		}
		while(scanf("%d",&n)!=EOF)
		{
		printf("%d\n",c1[n]);
		}
	return 0;
}

#include<stdio.h>
int main()
{
	int sum,n,i;
	while(scanf("%d",&n)!=EOF)
	{
		sum=0;
		for(i=0;3*i<=n;i++)
		{
			sum+=(n-3*i)/2+1;
		}
		printf("%d\n",sum);
	}
	return 0;
}


 需要满足的条件 k1 + 2 * k2 + 3 * k3 = n
 * 原理:先确定硬币3的个数k3,每一个k3都能确定剩下的硬币换取方案,且不重复
 * k3确定之后k1, k2只需要满足 k1 + 2 * k2 = n - 3 * k3
 * 而满足这样的任意一个k2对应了一个k1,k2的范围为 0...(n-3 * k3) / 2,一共有(n-3 * k3) / 2 + 1 个


//完全背包求方案总数
#include<stdio.h>
#include<string.h>
int main()
{
	int n,dp[33000],i,j;
	while(scanf("%d",&n)!=EOF)
	{
		memset(dp,0,sizeof(dp));
		dp[0]=1;
		for(i=1;i<=3;i++)
			for(j=i;j<=n;j++)
				dp[j]=dp[j-i]+dp[j];
	   printf("%d\n",dp[n]);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值