洛谷P2347-砝码称重(DP)

简介: 洛谷P2347-砝码称重(DP)

题目描述:


设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重≤1000),


输入格式:


输入方式:a1,a2,a3,a4,a5,a6


(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)


输出格式:


输出方式:Total=N


(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)


输入输出样例:


输入 #1复制


1 1 0 0 0 0

输出 #1复制


Total=3


AC Code:  


#include<bits/stdc++.h>
using namespace std;
#define N 1500
int dp[N],a[N];
int weight[7]={0,1,2,3,5,10,20};//6种砝码 
int ans;
int main() {
  for(int i=1;i<=6;i++) {
    scanf("%d",&a[i]);
  }
  dp[0]=1;//总重量为0即一个砝码也不用,我们将这种情况设为已有
  for(int i=1;i<=6;i++) {//枚举6种砝码 
    for(int j=1;j<=a[i];j++) {//第i种砝码的个数 
      for(int k=1000;k>=0;k--) {//总重量
      /*当k=0的时候,f[1]就会被标记为成立
      但接下来,当k=1的时候,f[2]也会被标记为成立
      那么是不是一遍扫过去,f[1~1000]全部都被标记为成立了呢!
      所以仔细想想:一定是倒序,而不是正序!!!*/ 
        if(dp[k]) {//若此重量成立
          dp[k+weight[i]]=1;//那么这个重量加上这个未使用的砝码的总重量也成立
        }
      }
    }
  }
  for(int i=1;i<=1000;i++) {//遍历所有重量(从1开始,因为不使用砝码的情况不算在内) 
    if(dp[i]) {//记录可以使用砝码称出的重量 
      ans++;
    }
  }
  printf("Total=%d\n",ans);
  return 0;
}



相关文章
|
2月前
lanqiao OJ 1447 砝码称重
lanqiao OJ 1447 砝码称重
31 1
|
2月前
lanqiao OJ 3513 岛屿个数(2023省赛)
lanqiao OJ 3513 岛屿个数(2023省赛)
16 2
10_最后一块石头的重量
10_最后一块石头的重量
|
2月前
acwing 1106 山峰和山谷
acwing 1106 山峰和山谷
16 0
|
2月前
acwing 2060 奶牛选美
acwing 2060 奶牛选美
36 0
|
7月前
|
Java
leetcode-1049. 最后一块石头的重量 II
leetcode-1049. 最后一块石头的重量 II
55 0
|
机器学习/深度学习 人工智能 移动开发
Acwing 1574. 接雨水
Acwing 1574. 接雨水
69 0
《蓝桥杯每日一题》递推·AcWing 3777. 砖块
《蓝桥杯每日一题》递推·AcWing 3777. 砖块
80 0
|
机器学习/深度学习 Java
AcWing——砝码称重
AcWing——砝码称重
93 0
leetcode 1049 最后一块石头的重量
leetcode 1049 最后一块石头的重量
95 0
leetcode 1049 最后一块石头的重量