砝码称重

题目描述
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000g)。求出用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况。

输入格式
只有一行,共有六个数,一次为1g、2g、3g、5g、10g、20g砝码的个数

输出格式
只有一行,为称出不同重量的个数

样例
样例输入
1 1 0 0 0 0
样例输出
Total=3
这个就是自己手搓背包(我认为是),从1000到0能满足的背包数量,这里拆分物品时尽量用二进制,避免出现大量小体积物品卡时间(例如逃亡的准备)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=10100;
const int maxw=10100000;
int n=0,m=0;
int f[maxw];//maxw为背包容量 
int v[maxn];
int w[7]={0,1,2,3,5,10,20};
int num[maxn];
int cnt=0,sum=0;
int main(){
	int vi,wi,imi;
	for(int i=1;i<=6;i++){//将物品用二进制的方法拆分 ,转化成01背包 
		cin>>imi;
		for(int j=1;j<=imi;j*=2){
			v[++cnt]=j*w[i];
			imi-=j;
		}
		if(imi>0){
			v[++cnt]=imi*w[i];
		}
	}
	f[0]=1;//容量为0的背包可以满足 
	for(int i=1;i<=cnt;i++){
		for(int j=1000;j>=v[i];j--) f[j]=f[j]||f[j-v[i]]; //||表示有任意一种情况成立它就成立,&&表示两种情况都成立时才成立
	}
	for(int i=1;i<=1000;i++) sum+=f[i];
	cout<<"Total="<<sum;
}
posted @ 2024-02-17 14:32  shaoyufei  阅读(36)  评论(0)    收藏  举报