题目链接:
题目大意:
n个货币,每个货币有一定的数量,然后问你从1~m有多少个数能被凑出来?
具体思路:
dp[i][j]代表前i个凑出j元钱第i个的最大剩余量。
二维(超内存):
1 #include<iostream>
2 #include<cstring>
3 #include<stdio.h>
4 using namespace std;
5 # define ll long long
6 # define lson l,mid,rt<<1
7 # define rson mid+1,r,rt<<1|1
8 # define inf 0x3f3f3f3f
9 const int maxn = 1e5+100;
10 const int N = 100+5;
11 int dp[N][maxn];
12 int a[N],b[N];
13 int main()
14 {
15 int n,m;
16 while(~scanf("%d %d",&n,&m)&&(n+m))
17 {
18 memset(dp,-1,sizeof(dp));
19 for(int i=1; i<=n; i++)
20 {
21 scanf("%d",&a[i]);
22 }
23 for(int i=1; i<=n; i++)
24 {
25 scanf("%d",&b[i]);
26 }
27 for(int i=0; i<=m; i++)
28 {
29 dp[i][0]=0;
30 }
31 // dp[0][0]=0;
32 for(int i=1; i<=n; i++)
33 {
34 for(int j=0; j<=m; j++)
35 {
36 if(dp[i-1][j]>=0)
37 dp[i][j]=b[i];
38 else
39 {
40 if(j<a[i]||dp[i][j-a[i]]<0)
41 dp[i][j]=-1;
42 else
43 dp[i][j]=dp[i][j-a[i]]-1;
44 }
45 }
46 }
47 int num=0;
48 for(int i=1; i<=m; i++)
49 {
50 num+=(dp[n][i]>=0 ? 1:0);
51 }
52 printf("%d
",num);
53 }
54 return 0;
55
56 }
一维:
1 #include<iostream>
2 #include<stdio.h>
3 #include<string>
4 #include<cstring>
5 using namespace std;
6 # define ll long long
7 # define lson l,mid,rt<<1
8 # define rson mid+1,r,rt<<1|1
9 # define inf 0x3f3f3f3f
10 const int maxn = 2e5+100;
11 const int N = 100+10;
12 int dp[maxn];
13 int a[maxn],b[maxn];
14 int main()
15 {
16 int n,m;
17 while(~scanf("%d %d",&n,&m)&&(n+m))
18 {
19 memset(dp,-1,sizeof(dp));
20 for(int i=1; i<=n; i++)
21 {
22 scanf("%d",&a[i]);
23 }
24 for(int i=1; i<=n; i++)
25 {
26 scanf("%d",&b[i]);
27 }
28 dp[0]=0;
29 for(int i=1; i<=n; i++)
30 {
31 for(int j=0; j<=m; j++)
32 {
33 if(dp[j]>=0)
34 dp[j]=b[i];
35 else
36 {
37 if(j<a[i]||dp[j-a[i]]<0)
38 dp[j]=-1;
39 else
40 dp[j]=dp[j-a[i]]-1;
41 }
42 }
43 }
44 int num=0;
45 for(int i=1; i<=m; i++)
46 {
47 num+=(dp[i]>=0 ? 1:0);
48 }
49 printf("%d
",num);
50 }
51 return 0;
52
53 }