#include <bits/stdc++.h>
using namespace std;
int c1[100000],c2[100000];
int num[4],maxn=0;
int value[4]={1,2,5};
int main(){while(scanf("%d%d%d",&num[0],&num[1],&num[2])){for(int i=0;i<3;++i) maxn+=value[i]*num[i];if(maxn==0)break;memset(c1,0,sizeof(c1));memset(c2,0,sizeof(c2));c1[0]=1;//只對(duì)1初始化就可以了
//int ma=0;
//maxn=0;for(int i=0;i<3;++i){ //覺(jué)得這三層循環(huán)非常重要,分別處理的是 第一個(gè)多項(xiàng)式 第一個(gè)和第二個(gè)多項(xiàng)式相乘 在和最后一個(gè)多項(xiàng)式相乘得到的結(jié)果,開(kāi)始的時(shí)候沒(méi)有注意到這一點(diǎn),在初始化上就直接把對(duì)第一個(gè)多項(xiàng)式給處理了。
//ma=maxn+num[i]*value[i];for(int j=0;j<=maxn;++j)for(int k=0;k<=num[i];++k)c2[j+k*value[i]]+=c1[j];for(int j=0;j<=maxn;++j){c1[j]=c2[j];c2[j]=0;}
//maxn=ma;}for(int i=0;i<=maxn+1;++i){if(!c1[i]){printf("%d\n",i);break;}}maxn=0;}return 0;
}
/*
還有一個(gè)減少?gòu)?fù)雜度的地方就是注釋掉的那四行代碼了。
*/
For example, assume N is 4, we can find: ??4 = 4; ??4 = 3 + 1; ??4 = 2 + 2; ??4 = 2 + 1 + 1; ??4 = 1 + 1 + 1 + 1; so the result is 5 when N is 4. Note that "4 = 3 + 1" and "4 = 1 + 3" is the same in this problem. Now, you do it!" 用生成函數(shù)比用dp整數(shù)拆分減少了很多思維 ?
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000;
int c1[maxn];
int c2[maxn];
int main()
{int n;while(scanf("%d",&n)!=EOF){memset(c1,0,sizeof(c1));memset(c2,0,sizeof(c2));//c1[0]=1;for(int i=0;i<=0;++i)c1[i]=1,c2[i]=0;
// for(int i=1;i<n;++i)只對(duì)n=0處理就好了
// c1[i]=1,c2[i]=0;for(int i=1;i<=n;++i){for(int j=0;j<=n;++j){for(int k=0;(k+j)<=n;k+=i){c2[j+k]+=c1[j];
}}for(int j=0;j<=n;++j)c1[j]=c2[j],c2[j]=0;}printf("%d\n",c1[n]);}return 0;
}