洛谷:P2347 砝码称重(dp,)

题目:

在这里插入图片描述

分析:和算法课上一道玩具题一样,设一个数组,可以的为1,不可以为0.每次对新的砝码进行新的可以的设为1.倒着来啊。这次又这样错了。

代码:—直接上述实现超时了:

#include<bits/stdc++.h>
using namespace std;
int A[6];//1 2 3 5 10 20
int main()
{
 for(int i=0;i<6;i++) cin>>A[i];
 int B[6]={1,2,3,5,10,20};
 long long D[1050];
 memset(D,0,sizeof(D));
 D[0]=1;
 for(int i=0;i<6;i++)
 for(int j=0;j<=A[i];j++)
 {
  for(int ii=1000;ii>=0;ii--) 
  {
   if(D[ii]) 
   {
    D[ii+j*B[i]]=1;
   } 
  }
 }
 long long c=0;
 for(int i=1;i<1050;i++) if(D[i]) c++;
 cout<<"Total="<<c;
}

题解:竟然还有个bitset:

#include <bitset>
#include <cstdio>
int a[10], w[10] = {1, 2, 3, 5, 10, 20};
std::bitset<1010> S;
int main() {
    for(int i = 0; i < 6; i++) scanf("%d", a + i);
    S[0] = 1;
    for(int i = 0; i < 6; i++) for(int j = 0; j < a[i]; j++) S |= S << w[i];
    printf("Total=%d\n", S.count() - 1);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/107669954