Coins POJ - 1742 (背包判断可行性)

 题目链接:

 POJ - 1742

题目大意:

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\n",num);
53     }
54     return 0;
55 
56 }
View Code

一维:

 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\n",num);
50     }
51     return 0;
52 
53 }
View Code

猜你喜欢

转载自www.cnblogs.com/letlifestop/p/10932986.html