COJ 0557 4013多重部分和問題

2022-05-23 02:45:07 字數 3999 閱讀 5070

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...