1、数字黑洞
#include<bits/stdc++.h>
using namespace std;
int main(){int n;cin>>n;int cnt=0;while(n!=495){int a=n/100;int b=(n/10)%10;int c=n%10;int x[3]={a,b,c};sort(x,x+3);//升序排序int max_num=x[2]*100+x[1]*10+x[0];int min_num=x[0]*100+x[1]*10+x[2];n=max_num-min_num;cnt++; }cout<<cnt<<endl;return 0;
}
2、国王的金矿
#include<bits/stdc++.h>
using namespace std;
int dp[15][105];
int w[15],c[15];
int n,m;
int main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>w[i]>>c[i];}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(w[i]>j)dp[i][j]=dp[i-1][j];else dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+c[i]);}}cout<<dp[n][m]<<endl;return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){int n,m;cin>>n>>m;int a[11],b[11];for(int i=1;i<=n;i++){cin>>a[i]>>b[i];}int dp[101]={0};for(int i=1;i<=n;i++){for(int j=m;j>=a[i];j--){dp[j]=max(dp[j],dp[j-a[i]]+b[i]);}}cout<<dp[m]<<endl;return 0;
}
3、糖果
#include<bits/stdc++.h>
using namespace std;int main(){int n,k;cin>>n>>k;int c[105];for(int i=0;i<n;i++){cin>>c[i];}// dp[r]表示余数为r时的最大糖果总数int dp[105];memset(dp,-1,sizeof(dp));dp[0] = 0; for(int i=0;i<n;i++){int cur = c[i]; // 当前糖果数量int r = cur % k; // 当前糖果对k的余数// 保存当前状态,避免重复使用同一糖果int a[105];memcpy(a, dp, sizeof(dp));// 遍历所有可能的余数for(int j=0;j<k;j++){if(a[j] != -1){int new_r = (j + r) % k; // 新余数int new_sum = a[j] + cur; // 新总数if(new_sum > dp[new_r]){dp[new_r] = new_sum;}}}}// 如果能找到余数为0的方案,输出最大总数,否则输出0cout << (dp[0] > 0 ? dp[0] : 0) << endl;return 0;
}
4、城市的交通网络图
#include<bits/stdc++.h>
using namespace std;
int dp[105];
int c[105][105];
int n;
int main(){cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>c[i][j];}}for(int i=1;i<=n;i++){dp[i]=1e9;}dp[1]=0;for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(c[i][j]!=0&&dp[j]>dp[i]+c[i][j]){dp[j]=dp[i]+c[i][j];}}}cout<<dp[n]<<endl;return 0;
}
5、午餐费用
#include<bits/stdc++.h>
using namespace std;
int dp[100005];
int c[35];
int n,m;
int main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>c[i];}for(int i=1;i<=n;i++){for(int j=m;j>=c[i];j--){if(dp[j]<dp[j-c[i]]+c[i]){dp[j]=dp[j-c[i]]+c[i];}}}cout<<dp[m]<<endl;return 0;
}
6、瓶子涂色
#include<bits/stdc++.h>
using namespace std;
int dp[3];
int r[100005],g[100005],b[100005];
int n;
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>r[i];}for(int i=1;i<=n;i++){cin>>g[i];}for(int i=1;i<=n;i++){cin>>b[i];}dp[0]=r[1];dp[1]=g[1];dp[2]=b[1];for(int i=2;i<=n;i++){int t0,t1,t2;t0=min(dp[1],dp[2])+r[i];t1=min(dp[0],dp[2])+g[i];t2=min(dp[0],dp[1])+b[i];dp[0]=t0;dp[1]=t1;dp[2]=t2;}cout<<min(min(dp[0],dp[1]),dp[2])<<endl;return 0;
}
7、zz买手机
#include<bits/stdc++.h>
using namespace std;const int N = 5005;
const int INF = 1e9 * (-5000 * 5000); // 最小可能值(足够小)int a[N]; // 前缀和数组(复用为pre_max)
int b[N]; // 长度为m的子序列和
int dp[N]; // 动态规划数组
int n, m, k;int main() {cin >> n >> m >> k;// 计算前缀和a[0] = 0;for (int i = 1; i <= n; ++i) {int x;cin >> x;a[i] = a[i - 1] + x;}// 计算所有长度为m的子序列和for (int i = m; i <= n; ++i) {b[i] = a[i] - a[i - m];}// 初始化dp数组memset(dp, 0, sizeof(dp));// 动态规划计算选择k组的最大和for (int j = 1; j <= k; ++j) {// 计算前缀最大值数组pre_max(复用a数组)a[0] = INF; // 初始化为极小值for (int i = 1; i <= n; ++i) {a[i] = max(a[i - 1], dp[i]);}// 更新当前j组的dp值for (int i = 1; i <= n; ++i) {if (i < j * m) {// 长度不足,无法选择j组dp[i] = INF;} else {// 不选第i个位置的子序列dp[i] = dp[i - 1];// 选第i个位置的子序列(需保证i >= m)if (i >= m) {dp[i] = max(dp[i], a[i - m] + b[i]);}}}}cout << dp[n] << endl;return 0;
}