4013多重部分和問題
難度級別:b; 執行時間限制:2000ms; 執行空間限制:262144kb; **長度限制:2000000b
試題描述
n種大小不同的數字 ai,每種各mi個,判斷是否可以從這些數字之中選出若干個使他們的和恰好為k。
輸入第一行為兩個正整數n,k。
第二行為n個數ai,以空格隔開。
第三行為n個數mi,以空格隔開。
輸出若可行則輸出"yes"
否則輸出"no"
輸入示例
3 17
3 5 8
3 2 2
輸出示例
yes其他說明
1<=n<=100
1<=k<=50000
1<=ai<=40
1<=mi<=50
若數字相同對程式並無影響。
題解:此題有四個層次:
1.列舉bool亂搞:
1//標程4
2 #include3 #include4 #include5 #include6 #include7 #include8
#define pau putchar(' ')
9#define ent putchar('\n')
10using
namespace
std;
11const
int maxn=100+10,maxm=50000+10,inf=-1u>>1;12
bool d[maxn][maxm];int
n,tar,a[maxn],num[maxn];
13 inline int
read()
16while(isdigit(ch)) x=10*x+ch-'
0',ch=getchar();
17return x*=sig;18}
19 inline void write(int
x)if(x<0) putchar('
-'),x=-x;
21int len=0,buf[15];while(x) buf[len++]=x%10,x/=10;22
for(int i=len-1;i>=0;i--) putchar(buf[i]+'
0');return;23
}24void
init()
31void
work()
41void
print()
44int
main()
2.快看窩萌還可以滾動,好神奇!
1//標程3
2 #include3 #include4 #include5 #include6 #include7 #include8
#define pau putchar(' ')
9#define ent putchar('\n')
10using
namespace
std;
11const
int maxn=100+10,maxm=50000+10,inf=-1u>>1;12
bool d[2][maxm];int
n,tar,a[maxn],num[maxn];
13 inline int
read()
16while(isdigit(ch)) x=10*x+ch-'
0',ch=getchar();
17return x*=sig;18}
19 inline void write(int
x)if(x<0) putchar('
-'),x=-x;
21int len=0,buf[15];while(x) buf[len++]=x%10,x/=10;22
for(int i=len-1;i>=0;i--) putchar(buf[i]+'
0');return;23
}24void
init()
31void
work()
39if(d[tc][tar]) puts("
yes"
);40
else puts("no"
);41
return;42
}43void
print()
46int
main()
3.窩萌還可以搞出正好湊成k的:
1//標程2
2 #include3 #include4 #include5 #include6 #include7 #include8
#define pau putchar(' ')
9#define ent putchar('\n')
10using
namespace
std;
11const
int maxn=100+10,maxm=50000+10,inf=-1u>>1;12
int d[2
][maxm],n,tar,a[maxn],num[maxn];
13 inline int
read()
16while(isdigit(ch)) x=10*x+ch-'
0',ch=getchar();
17return x*=sig;18}
19 inline void write(int
x)if(x<0) putchar('
-'),x=-x;
21int len=0,buf[15];while(x) buf[len++]=x%10,x/=10;22
for(int i=len-1;i>=0;i--) putchar(buf[i]+'
0');return;23
}24void
init()
31void
work()40}
41if(d[tc][tar]>=0) puts("
yes"
);42
else puts("no"
);43
return;44
}45void
print()
48int
main()
4.快看窩萌還可以滾動,好神奇!
1//標程1
2 #include3 #include4 #include5 #include6 #include7 #include8
#define pau putchar(' ')
9#define ent putchar('\n')
10using
namespace
std;
11const
int maxn=100+10,maxm=50000+10,inf=-1u>>1;12
intd[maxm],n,tar,a[maxn],num[maxn];
13 inline int
read()
16while(isdigit(ch)) x=10*x+ch-'
0',ch=getchar();
17return x*=sig;18}
19 inline void write(int
x)if(x<0) putchar('
-'),x=-x;
21int len=0,buf[15];while(x) buf[len++]=x%10,x/=10;22
for(int i=len-1;i>=0;i--) putchar(buf[i]+'
0');return;23
}24void
init()
32void
work()40}
41if(d[tar]>=0) puts("
yes"
);42
else puts("no"
);43
return;44
}45void
print()
48int
main()
結論:然並卵。
多重部分和
有n中大小不同的數字ai,每種有mi個,判斷從這些數中取出若干能否組成數k 可以輸出yes 不可以輸出no dp i j 是第i個數組合數j時剩餘幾個a i 不能組合為 1 未優化遞推式 容易理解,實現後觀察加深理解 dp i j 0 dp i 1 j m i dp i 1 j a i 0 j 其他...
多重部分和問題
有 n 種物品,第i種物品的每個物品的價值是 ai 數目是 mi 判斷是否可以選擇若干數字使得價值和是k。1 n 100 1 ai,m i,10 5 1 k 105 看作揹包大小是k,物品的價值和體積都是ai 物品數目是 mi 的多重揹包。如果最大價值是 k 的話就是可以選出,否則便是不能選出。利用...
多重部分和問題
有n種不同大小的數字a i 每種各m i 個。判斷是否可以從這些數字之中選出若干使它們的和恰好為k。dp i 表示以a i 為末尾的最長上公升子串行的長度。include include include includeusing namespace std define maxn 10010 int...