1 条题解
-
0
C :
#include "stdio.h" int n,m; int a[100],f[1000001]; int main() { int i,j; int flag; scanf("%d%d",&m,&n); for(i=0;i<n;i++) scanf("%d",&a[i]); f[0]=1; for(i=0;i<n;i++) { for(j=m;j>=a[i];j--) if(f[j-a[i]]) f[j]++; } if(!f[m]) printf("0\n"); else if(f[m]>1) printf("-1\n"); else { flag=1; for(i=0;i<n;i++) { if(m<a[i]||f[m-a[i]]==0) { if(flag) { printf("%d",i+1); flag=0; } else printf(" %d",i+1); } else m-=a[i]; } } return 0; }C++ :
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; int totalw,n,w[101],f[1000001]={0}; int p[1000001]={0}; int work(); int main() { //freopen("bag.in","r",stdin); //freopen("bag.out","w",stdout); work(); return 0; } int work() { int tot=0; cin>>totalw; cin>>n; for(int i=1;i<=n;i++) { cin>>w[i]; tot+=w[i]; } tot-=totalw; f[0]=1; for(int i=1;i<=n;i++) { for(int j=tot;j>=w[i];j--) { if(f[j]==0) p[j]=i; //不管f[j]的前一个点是否为0,p[j]记录的是第一次达到j的物品 f[j]=f[j]+f[j-w[i]]; if(f[tot]>1) { cout<<"-1"<<endl; return 0; } } } if(f[tot]==0) { cout<<0<<endl; return 0; } queue<int> q; int i=tot; int a[101],len=0; while(i>0) { len++; a[len]=p[i]; i=i-w[p[i]]; } for(int i=len;i>1;i--)cout<<a[i]<<' '; cout<<a[1]<<endl; return 0; }
信息
- ID
- 2212
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者