2 条题解
-
0
背包板子。
#include<bits/stdc++.h> #define int long long #define INF 0x3f3f3f using namespace std; int n,v,a[1001],b[1001],f[1001]; signed main(){ while(cin>>n>>v){ if(!n&&!v)return 0; for(int i=1;i<=n;i++) cin>>a[i]>>b[i]; memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) for(int j=v;j>=a[i];j--) f[j]=max(f[j],f[j-a[i]]+b[i]); cout<<f[v]<<"\n"; } return 0; }
题外话:神奇的是,我开了滚动数组就 AC,不开就连样例都过不了。
-
0
C :
#include<stdio.h> #include<string.h> int main() { int w[1001],c[1001],dp[1001]; int n,v,i,j; while(scanf("%d%d",&n,&v)==2) { if(n==0&&v==0) break; memset(dp,0,sizeof(dp)); for(i=0; i<n; ++i) scanf("%d%d",&c[i],&w[i]); for(i=0; i<n; ++i) for(j=v; j>=c[i]; --j) { if(dp[j]<dp[j-c[i]]+w[i]) dp[j]=dp[j-c[i]]+w[i]; } printf("%d\n",dp[v]); } }
C++ :
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<cstdlib> using namespace std; int f[1010][1010]; int weight[1010],cost[1010]; int main() { int n,v,i,j; while(cin>>n>>v) { if(n == 0 && v == 0) break; memset(f,0,sizeof(f)); for(i = 1; i <= n; i++) cin>>weight[i]>>cost[i]; for(i = 1; i <= n; i++) { for(j = 0; j <= v; j++) { f[i][j] = f[i-1][j]; if(j>=weight[i]) f[i][j] = max(f[i-1][j],f[i-1][j-weight[i]] + cost[i]); } } cout<<f[n][v]<<endl; } return 0; }
- 1
信息
- ID
- 1838
- 时间
- 3000ms
- 内存
- 64MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者