1 条题解
-
0
C :
#include<stdio.h> #define max(a,b) (a>b?a:b) int n,m; long long f[100000]; int main() { scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) { int w,v,s; scanf("%d %d %d",&w,&v,&s); for(int j=m;j>=0;j--) for(int t=1;t*w<=j&&t<=s;t++) f[j]=max(f[j],f[j-w*t]+v*t); } printf("%lld",f[m]); return 0; }
C++ :
#include <bits/stdc++.h> using namespace std; //由于要将物品拆分 int f[2020],v[15050],w[15050]; int op = 0; int main() { //二进制优化 //7:表示为0~7的和 //7分为:1 1 1 1 1 1 1,将7件物品分为7种物品 //二进制分法:2^2+2^1+2^0 //凑出一个整数Si的时间复杂度:log2(Si) /* 如果要凑一个整数10 理论上需要log2(10)=4个数 但4个数1 2 4 8,不过会多凑一些数出来 但其实需要的数是: 1 2 4 3就能凑出0~10 也就是说:2^p是<=Si 2^p+1 > Si,求出一个p 这个p就是需要的数的数量 需要的最后一个数 = Si - (2^0+2^1+...+2^p) */ int n,m; cin>>n>>m; //拆分物品 for(int i = 1;i <= n;i++){ int v1,w1,s; cin>>v1>>w1>>s; int k = 1;//k代表2的幂 while(k <= s){ v[++op] = v1 * k; w[op] = w1 * k; s -= k; k *= 2; } //如果s还有值,说明s不是正好是2的整数次方 if(s){ v[++op] = v1 * s; w[op] = w1 * s; } } //转换为01背包 for(int i = 1;i <= op;i++){ for(int j = m;j >= v[i];j--){ f[j] = max(f[j],f[j-v[i]]+w[i]); } } cout<<f[m]; return 0; }
- 1
信息
- ID
- 2759
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 9
- 已通过
- 1
- 上传者