1.基础算法
1022-Music Problem_2021秋季算法入门班第七章习题:动态规划1 (nowcoder.com)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1,mod=3600;
int dp[2][3600];
int a[N];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
a[i]%=mod;
}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=n;++i){
if(dp[0][0]>1){
break;
}
for(int j=0;j<3600;++j){//将它们根据模3600的结果分成3600组,选出模为0的数
int now=((j-a[i])%mod+mod)%mod;
dp[1][j]+=dp[0][now];
}
for(int j=0;j<=3600;++j){
dp[0][j]+=dp[1][j];
dp[1][j]=0;
}
}
if(dp[0][0]>1){
puts("YES");
}else{
puts("NO");
}
}
return 0;
}
1023-美味菜肴_2021秋季算法入门班第七章习题:动态规划1 (nowcoder.com)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[1<<20],b[1<<20];
struct node
{
ll b,a,c;
}a[1<<20];
bool cmp(node x,node y){
return x.b*y.c>x.c*y.b;
}
int main()
{
int n,m,T;
cin>>n>>m>>T;
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=m;i++) cin>>a[i].b>>a[i].a>>a[i].c, a[i].b=b[a[i].b];
sort(a+1,a+1+m,cmp);
for(int i=1;i<=T;i++) dp[i]=-1e18;
for(int i=1;i<=m;i++)
for(int l=T;l>=a[i].c;l--)
dp[l]=max(dp[l],dp[l-a[i].c]+a[i].a-l*a[i].b);
ll ans=-1e18;
for(int i=1;i<=T;i++) ans=max(ans,dp[i]);
cout<<ans<<endl;
return 0;
}