4 条题解
-
9
代码如下
#include <bits/stdc++.h> using namespace std; int n,f[1000001],w[1000001]; void work(int x){//用一个子函数进行计算,求出i的所有约数和. for(int i = 1;i < x;i++) if(x % i == 0) w[x]+=i; } int main(){ cin >> n; for(int i = 1;i <= n;i++) work(i); for(int i = 1;i <= n;i++){ for(int j = n;j >= i;j--){//对于数字i来说,它的体积就是i本身. f[j] = max(f[j],f[j-i]+w[i]);//后面就是一个标准的01背包问题,可以参考课上的代码。 } } cout << f[n];//最后输出f[n]就行了 return 0; }
❤️ ***~ 一个赞抱走~***❤️
-
5
思路
这道题相对比较简单,对于数字i来说,它的体积就是i本身,它的价值可以用一个子函数进行计算,求出i的所有约数和就可以了~后面就是一个标准的01背包问题就不赘述了。代码
#include<iostream> using namespace std; int s,w[10002]; int f[10002]; void work(int x) { for(int i=1;i<x;i++) if(x%i==0) w[x]+=i; } int main() { cin>>s; for(int i=1;i<=s;i++) work(i); for(int i=1;i<=s;i++) for(int j=s;j>=i;j--) f[j]=max(f[j],f[j-i]+w[i]); cout<<f[s]; return 0; }
-
-1
按课上老师讲的:
#include<iostream> using namespace std; int s,w[10002]; int f[10002]; void work(int x) { for(int i=1;i<x;i++) if(x%i==0) w[x]+=i; } int main() { cin>>s; for(int i=1;i<=s;i++) work(i); for(int i=1;i<=s;i++) for(int j=s;j>=i;j--) f[j]=max(f[j],f[j-i]+w[i]); cout<<f[s]; return 0; }
-
-1
#include <bits/stdc++.h> #define ll long long #define endl "\n" using namespace std; int s, v[1005], f[1005]; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> s; for (int i = 1; i <= s; i++) { for (int j = 1; j * j <= i; j++) // 约数和 { if (i % j == 0) { v[i] += j + i / j; if (j == i / j) { v[i] -= j; } } } v[i] -= i; for (int j = s; j >= i; j--) // 01背包 { f[j] = max(f[j], f[j - i] + v[i]); } // cout << v[i] << " "; } cout << endl << f[s]; return 0; }
- 1
信息
- ID
- 372
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- (无)
- 递交数
- 353
- 已通过
- 264
- 上传者